Fork Me On Github

windows 安装 Redis

  1. 在任务栏搜索 启用或关闭Windows功能
  2. 选择 适用于Linux的Windows子系统
  3. 在应用商店安装 Ubuntu
  4. 安装编译环境
sudo apt-get update
sudo apt-get install make
sudo apt-get install gcc
  1. 安装
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
sudo make install
sudo cp redis.conf /etc/redis.conf
  1. 启动
cd /usr/local/bin
redis-server /etc/redis.conf

redis-server /etc/redis.conf &     #指定配置文件启动redis,且后台启动

安全配置

redis .conf

protected-mode yes   #打开保护模式
port 6380  #更改默认启动端口
requirepass xxxxxx   #设置redis启动密码,xxxx是自定义的密码

来禁用远程修改 DB 文件地址

rename-command FLUSHALL ""
rename-command CONFIG   ""
rename-command EVAL     ""

禁止外网访问 Redis

bind 127.0.0.1

使用

字符串(String)

可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等,最多可以容纳的数据长度是512M

set mykey "this is a test"   //通过set命令为键设置新值,并覆盖原有值。
get mykey

incr mykey                 //该Key的值递增1
decr mykey                 //该Key的值递减1
del mykey                  //删除已有键

哈希(Hash)

键值对字典结构

列表(List)

简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

集合(Set)

是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

有序集合(sorted set)

有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

使用问题

雪崩

指缓存中大批量热点数据过期后系统涌入大量查询请求,因为大部分数据在Redis层已经失效,请求渗透到数据库层,大批量请求犹如洪水一般涌入,引起数据库压力造成查询堵塞甚至宕机。

解决办法:

  1. 将缓存失效时间分散开,比如每个key的过期时间是随机,防止同一时间大量数据过期现象发生,这样不会出现同一时间全部请求都落在数据库层,如果缓存数据库是分布式部署,将热点数据均匀分布在不同Redis和数据库中,有效分担压力,别一个人扛。
  2. 简单粗暴,让Redis数据永不过期(如果业务准许,比如不用更新的名单类)。当然,如果业务数据准许的情况下可以,比如中奖名单用户,每期用户开奖后,名单不可能会变了,无需更新。

缓存穿透

指访问不存在的数据,导致跳过缓存,直接访问数据库。

例如:数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

解决办法:

  1. 每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

缓存击穿

就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

解决办法:

  1. 可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。
标签: redis
点击查看全文
0 7 0