1 Redis 环境准备
1.1 下载
1 安装wget工具 => $ yum install wget
cd /opt/package
2 下载安装包 => $ wget https://download.redis.io/releases/redis-6.2.3.tar.gz
3 解压到本地 => $ tar xf redis-6.2.3.tar.gz
1.2 安装
1 下载编译工具 => $ yum install gcc
cd redis-6.2.3
2 编译 => $ make
cd redis-6.2.3/src
3 安装 => make install PREFIX=/opt/software/redis6
4 配置环境变量 => $ vim /etc/profile
export REDIS_HOME=/opt/software/redis6
export PATH=$PATH:$REDIS_HOME/bin
$ source /etc/profile
cd redis-6.2.3/utils
5 安装并启动服务(可以安装多个) => $ ./install_server.sh
6 如果报错:Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!
=> $ vi ./install_server.sh
# 注释以下代码
#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
2 二进制安全
编码解码由客户端完成,Redis只存二进制值。举个简单的例子:如果客户端使用UTF-8编码的存入了中: \xe4\xb8\xad
,使用GBK编码获取,得到的是涓: \xe4\xb8\xad
。
3 发布订阅
订阅、取消订阅和发布实现了发布/订阅消息范式,发布者不是计划发送消息给特定的订阅者。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。
4.1 简单使用
$ SUBSCRIBE first second
$ PUBLISH second Hello
$ UNSUBSCRIBE first second
# 通配符形式
$ SUBSCRIBE f*
$ PUBLISH f* Hello
4 key 的有效期
4.1 设置有效期
$ expire key second
# 以下情况回使过期时间失效
$ set key value
# 以下情况不会
$ incr key
$ hset key field value
$ hincrby key field increment
4.2 过期后key的淘汰策略
Redis keys过期有两种方式:被动和主动方式。
- 被动:当一些客户端尝试访问它时,key会被发现并主动的过期。但是如果永远不访问这些key的话,就会永久的占用内存。
- 主动:定时随机测试设置keys的过期时间,具体就是Redis每秒10次做的事情:
- 测试随机的20个keys进行相关过期检测
- 删除所有已经过期的keys
- 如果有多于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 文件形式
下载转码工具 ==> $ yum install unix2dos
转码 ==> unix2dos data.txt
插入数据 ==> $ cat data.txt | redis-cli --pipe
入指令文件最好不要在一行结束留空格或者留空行,否则会出现意想不到的问题。
6.2 使用Redis协议
它会非常简单的生成和解析Redis协议,Redis协议文档请参考Redis协议说明。 但是为了生成大量数据插入的目标,你需要了解每一个细节协议。