1 Redis 环境准备

1.1 下载

  1. 1 安装wget工具 => $ yum install wget
  2. cd /opt/package
  3. 2 下载安装包 => $ wget https://download.redis.io/releases/redis-6.2.3.tar.gz
  4. 3 解压到本地 => $ tar xf redis-6.2.3.tar.gz

1.2 安装

  1. 1 下载编译工具 => $ yum install gcc
  2. cd redis-6.2.3
  3. 2 编译 => $ make
  4. cd redis-6.2.3/src
  5. 3 安装 => make install PREFIX=/opt/software/redis6
  6. 4 配置环境变量 => $ vim /etc/profile
  7. export REDIS_HOME=/opt/software/redis6
  8. export PATH=$PATH:$REDIS_HOME/bin
  9. $ source /etc/profile
  10. cd redis-6.2.3/utils
  11. 5 安装并启动服务(可以安装多个) => $ ./install_server.sh
  12. 6 如果报错:Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!
  13. => $ vi ./install_server.sh
  14. # 注释以下代码
  15. #bail if this system is managed by systemd
  16. #_pid_1_exe="$(readlink -f /proc/1/exe)"
  17. #if [ "${_pid_1_exe##*/}" = systemd ]
  18. #then
  19. # echo "This systems seems to use systemd."
  20. # echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
  21. # exit 1
  22. #fi

2 二进制安全

编码解码由客户端完成,Redis只存二进制值。举个简单的例子:如果客户端使用UTF-8编码的存入了中: \xe4\xb8\xad,使用GBK编码获取,得到的是涓: \xe4\xb8\xad

3 发布订阅

订阅、取消订阅和发布实现了发布/订阅消息范式,发布者不是计划发送消息给特定的订阅者。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。

4.1 简单使用

  1. $ SUBSCRIBE first second
  2. $ PUBLISH second Hello
  3. $ UNSUBSCRIBE first second
  4. # 通配符形式
  5. $ SUBSCRIBE f*
  6. $ PUBLISH f* Hello

4 key 的有效期

4.1 设置有效期

  1. $ expire key second
  2. # 以下情况回使过期时间失效
  3. $ set key value
  4. # 以下情况不会
  5. $ incr key
  6. $ hset key field value
  7. $ hincrby key field increment

4.2 过期后key的淘汰策略

Redis keys过期有两种方式:被动主动方式。

  1. 被动:当一些客户端尝试访问它时,key会被发现并主动的过期。但是如果永远不访问这些key的话,就会永久的占用内存。
  2. 主动:定时随机测试设置keys的过期时间,具体就是Redis每秒10次做的事情:
    1. 测试随机的20个keys进行相关过期检测
    2. 删除所有已经过期的keys
    3. 如果有多于25%的keys过期,重复步奏a

4.3 在复制AOF文件时如何处理过期

为了获得正确的行为而不牺牲一致性,当一个key过期,DEL将会随着AOF文字一起合成到所有的slaves中。在master实例中,这种方法是集中的,并且不存在一致性错误的机会。
然而,当slaves连接到master时,不会独立过期keys(会等到master执行DEL命令),他们任然会在数据集里面存在,所以当slave当选为master时淘汰keys会独立执行,然后成为master。

5 内存回收策略

maxmemory配置指令用于配置Redis存储数据时指定限制的内存大小。通过redis.conf可以设置该指令,或者之后使用CONFIG SET命令来进行运行时配置。当maxmemory限制达到的时候Redis会使用的行为由 Redis的maxmemory-policy配置指令来进行配置。可用策略如下:

  • noeviction:返回错误,当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
  • allkeys-lru:尝试回收最近最少使用的键(LRU),使得新添加的数据有空间存放。
  • volatile-lru:尝试回收最近最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  • allkeys-random:回收随机的键使得新添加的数据有空间存放。
  • volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  • volatile-ttl:回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

如果没有键满足回收的前提条件的话,策略volatile-lru、volatile-random 、volatile-ttl 就和 noeviction 差不多了。选择正确的回收策略是非常重要的,这取决于你的应用的访问模式,不过你可以在运行时进行相关的策略调整,并且监控缓存命中率和没命中的次数,通过RedisINFO命令输出以便调优。一般的经验规则:

  • 使用allkeys-lru策略:当你希望你的请求符合一个幂定律分布,也就是说,你希望部分的子集元素将比其它其它元素被访问的更多。如果你不确定选择什么,这是个很好的选择。
  • 使用allkeys-random:如果你是循环访问,所有的键被连续的扫描,或者你希望请求分布正常(所有元素被访问的概率都差不多)。
  • 使用volatile-ttl:如果你想要通过创建缓存对象时设置TTL值,来决定哪些对象应该被过期。

allkeys-lru 和 volatile-random策略对于当你想要单一的实例实现缓存及持久化一些key时很有用。不过一般运行两个实例是解决这个问题的更好方法。为key设置过期时间也是需要消耗内存的,所以使用allkeys-lru这种策略更加高效,因为当内存有压力时没有必要为key去设置过期时间。

5.1 回收进程如何工作

  • 一个客户端运行了新的命令,添加了新的数据。
  • Redi检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收。
  • 一个新的命令被执行。

5.2 Redis使用的LRU

Redis的LRU算法并非完整的实现。这意味着Redis并没办法选择最久未被访问的键来进行回收。相反它会尝试运行一个近似LRU的算法,通过对少量keys进行取样,然后回收其中一个较早时间被访问的key。不过从Redis 3.0算法已经改进为回收key的候选池子。这改善了算法的性能,使得更加近似真是的LRU算法的行为。
Redis LRU有个很重要的点,你通过调整每次回收时检查的采样数量,以实现调整算法的精度。这个参数可以通过以下的配置指令调整:maxmemory-samples 5

6 Redis 插入大量数据

使用管道模式 reids-cli --pipe

6.1 文件形式

  1. 下载转码工具 ==> $ yum install unix2dos
  2. 转码 ==> unix2dos data.txt
  3. 插入数据 ==> $ cat data.txt | redis-cli --pipe

入指令文件最好不要在一行结束留空格或者留空行,否则会出现意想不到的问题。

6.2 使用Redis协议

它会非常简单的生成和解析Redis协议,Redis协议文档请参考Redis协议说明。 但是为了生成大量数据插入的目标,你需要了解每一个细节协议。