Redis(REmote DIctionary Server远程字典服务器)是一个开源的基于内存的键值型NoSQL,使用ANSI C语言编写、遵守BSD协议、支持网络、支持持久化,命令单线程型,日志型,并提供多种语言的API。
参考网站
官网: Redis、Redis | The Real-time Data Platform
中文网: Redis中文学习网 - Redis开发与运维技术、Redis教程、使用手册、CRUG网站、http://www.redisfans.com/
在线测试: Try Redis
作者网站: antirez (Salvatore Sanfilippo) · GitHub、List of posts - <antirez>
SQL和NoSQL对比
Redis是一种NoSQL,SQL和NoSQL对比如下:
SQL | NoSQL | |
数据结构 | 结构化(Structured) | 非结构化: 键值类型(Key-Value):如Redis 文档类型(Document):如MongoDB 列类型:如HBase 图类型(Graph):如Neo4j |
数据关联 | 关系型(Relational) | 非关系型,无外键关联 |
查询方式 | SQL查询 | 非SQL查询,各种产品查询方式不同 |
事务特性 | ACID | BASE |
存储介质 | 磁盘 | 主要为内存 |
扩展性 | 垂直 | 水平 |
Redis优势
性能极高 – 基于内存、IO多路复用,读110000次/s,写81000次/s。
数据类型丰富 – 十种数据类型,五种常用(string,list,set,zset,hash)。
原子性 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
支持数据持久化 – 可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
支持数据备份 – 即master-slave模式的数据备份。
提供多种语言的API
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis使用场景
分布式缓存
分布式锁
队列削峰
排行榜
版本命名规则
版本号第二位如果是奇数,则为非稳定版本,如2.7、2.9、3.1
版本号第二位如果是偶数,则为稳定版本,如2.6、2.8、3.0、3.2
当前奇数版本就是下一个稳定版本的开发版本,如2.9版本是3.0版本的开发版本
版本6.07有bug,Redis6应当使用6.08以上。
-
- 安装
Linux安装(redis-7.0.0.tar.gz)
检查gcc版本:
gcc是C程序的编译工具,已验证gcc版本4.8.5以上可编译Redis7。查看gcc版本:
# gcc --version #或gcc -v
如果未安装,安装之:
# yum install gcc -y #或yum -y install gcc-c++
下载并安装Redis:
# mkdir -p /opt/redis
# cd /opt/redis
# wget https://download.redis.io/releases/redis-7.0.8.tar.gz
# tar -zxvf redis-7.0.8.tar.gz
# cd redis-7.0.8
# make && make install
执行完 make 命令后,redis-7.0.8/src目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli
启动测试
# cd /usr/local/bin
# ./redis-server
也可以在任意目录运行redis-server命令来启动(命令已加入环境变量)
设置开机后台启动
# 复制配置文件
cp /opt/redis/redis-7.0.8/redis.conf /usr/local/bin
# 修改配置
vi /usr/local/bin/redis.conf
1.把daemonize no改为daemonize yes(后台运行)
2.把bind 127.0.0.1注释掉(允许远程连接)
3.把protected-mode属性设为no (允许远程连接)
注:远程连接还需开放端口或关闭防火墙
添加开机启动服务
vi /etc/systemd/system/redis.service
[Unit] Description=redis-server After=network.target [Service] Type=forking ExecStart=/usr/local/bin/redis-server /usr/local/bin/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target |
注:ExecStart配置成自己的安装路径
# 重载配置文件
systemctl daemon-reload
# 设置开机自启
systemctl enable redis.service
# 启动服务
systemctl start redis.service
常用命令
# #启动redis服务
sudo systemctl start redis-server
#停止redis服务
sudo systemctl stop redis-server
#重新启动服务
sudo systemctl restart redis-server
#查看服务当前状态
sudo systemctl status redis-server
#设置开机自启动
sudo systemctl enable redis-server
#停止开机自启动
sudo systemctl disable redis-server
root@twx-virtual-machine:/opt/redis-7.0.8# ll /usr/local/bin
总用量 22292
drwxr-xr-x 2 root root 4096 3月 3 01:05 ./
drwxr-xr-x 10 root root 4096 3月 1 2018 ../
-rwxr-xr-x 1 root root 5358928 3月 3 01:05 redis-benchmark*
lrwxrwxrwx 1 root root 12 3月 3 01:05 redis-check-aof -> redis-server*
lrwxrwxrwx 1 root root 12 3月 3 01:05 redis-check-rdb -> redis-server*
-rwxr-xr-x 1 root root 5623104 3月 3 01:05 redis-cli*
lrwxrwxrwx 1 root root 12 3月 3 01:05 redis-sentinel -> redis-server*
-rwxr-xr-x 1 root root 11832928 3月 3 01:05 redis-server*
启动Redis服务:
# src/redis-server #这种方式是以默认配置(redis.conf)启动Redis。也可以使用指定配置文件启动redis:# src/redis-server 指定配置文件.conf
启动redis服务进程后,新开一个终端窗口就可以使用测试客户端程序redis-cli和redis服务交互了(退出redis-cli命令为quit)。 比如:
[twx@bogon redis-3.2.9]# src/redis-cli 127.0.0.1:6379> SET foo bar OK 127.0.0.1:6379> get foo "bar" 127.0.0.1:6379> |
Windows安装(Redis-x64-3.2.100.zip)
Redis官方未提供Windows版本,可在GitHub上获取第三方提供的Windows版本,或者使用Docker容器来在Windows上运行Redis:
Releases · microsoftarchive/redis · GitHub
Releases · microsoftarchive/redis · GitHub
Releases · tporadowski/redis · GitHub
下载zip文件后解压,在解压目录打开CMD,执行命令:
redis-server.exe redis.windows.conf
启动Redis服务的CMD窗口,不要关闭,因为服务需要一直运行,关闭服务,直接关闭窗口就行。
在当前目录新开一个CMD窗口,执行命令:
redis-cli.exe
启动Redis客户端工具和Redis服务进行交互
-
- 的5种数据类型
Redis是一个内存中的key-value型数据库。也就是说,该数据库中的每条记录,都是由一个key和一个value构成的,其中value有五种类型:String(字符串)、List(列表)、Set(集合)、Sorted Set(有序集合)、Hash(字典)。
5种类型简介和使用场景
简介 | 使用场景 | |
String (字符串) | value可为String或数字,默认字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。 | String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。 |
List (列表) | value为字符串双向链表,类似C++中的std::list。可从头部或尾部向Redis列表添加元素。列表的最大长度为2^32 - 1,也即每个列表支持超过40亿个元素。 | twitter的关注列表、粉丝列表 轻量级消息队列,生产者push,消费者pop/bpop 抢红包、 |
Set (集合) | 可以理解为一堆值不重复的列表,可求交集、并集、差集。 set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。 | Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。 又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。 |
Sorted Set (有序集合) | Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序。 Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为2^32- 1元素(4294967295,超过40亿每个元素的集合)。 Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。 | Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。 又比如用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。 |
Hash (字典) | 类似C#中的dict类型或者C++中的hash_map类型。 Value为HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。 | 假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。 |
5种类型相关命令和使用示例
相关命令 | 使用示例 | |
String (字符串) | SET key value 设置key=value GET key 或者键key对应的值 GETRANGE key start end 得到字符串的子字符串存放在一个键 GETSET key value 设置键的字符串值,并返回旧值 GETBIT key offset 返回存储在键位值的字符串值的偏移 MGET key1 [key2..] 得到所有的给定键的值 SETBIT key offset value 设置或清除该位在存储在键的字符串值偏移 SETEX key seconds value 键到期时设置值 SETNX key value 设置键的值,只有当该键不存在 SETRANGE key offset value 覆盖字符串的一部分从指定键的偏移 STRLEN key 得到存储在键的值的长度 MSET key value [key value...] 设置多个键和多个值 MSETNX key value [key value...] 设置多个键多个值,只有在当没有按键的存在时 PSETEX key milliseconds value 设置键的毫秒值和到期时间 INCR key 增加键的整数值一次 INCRBY key increment 由给定的数量递增键的整数值 INCRBYFLOAT key increment 由给定的数量递增键的浮点值 DECR key 递减键一次的整数值 DECRBY key decrement 由给定数目递减键的整数值 APPEND key value 追加值到一个键 其中用于操作管理键的命令有: DEL key 如果存在删除键 DUMP key 返回存储在指定键的值的序列化版本 EXISTS key 此命令检查该键是否存在 EXPIRE key seconds 指定键的过期时间 EXPIREAT key timestamp 指定的键过期时间。在这里,时间是在Unix时间戳格式 PEXPIRE key milliseconds 设置键以毫秒为单位到期 PEXPIREAT key milliseconds-timestamp 设置键在Unix时间戳指定为毫秒到期 KEYS pattern 查找与指定模式匹配的所有键 MOVE key db 移动键到另一个数据库 PERSIST key 移除过期的键 PTTL key 以毫秒为单位获取剩余时间的到期键。 TTL key 获取键到期的剩余时间。 RANDOMKEY 从Redis返回随机键 RENAME key newkey 更改键的名称 RENAMENX key newkey 重命名键,如果新的键不存在 TYPE key 返回存储在键的数据类型的值。 | redis 127.0.0.1:6379> set baidu http://www.baidu OK redis 127.0.0.1:6379> append baidu .com (integer) 20 redis 127.0.0.1:6379> get baidu "http://www.baidu.com" redis 127.0.0.1:6379> set visitors 0 OK redis 127.0.0.1:6379> incr visitors (integer) 1 redis 127.0.0.1:6379> incr visitors (integer) 2 redis 127.0.0.1:6379> get visitors "2" redis 127.0.0.1:6379> incrby visitors 100 (integer) 102 redis 127.0.0.1:6379> get visitors "102" redis 127.0.0.1:6379> type baidu string redis 127.0.0.1:6379> type visitors string redis 127.0.0.1:6379> ttl baidu (integer) -1 redis 127.0.0.1:6379> rename baidu baidu-site OK redis 127.0.0.1:6379> get baidu (nil) redis 127.0.0.1:6379> get baidu-site "http://www.baidu.com" |
List (列表) | BLPOP key1 [key2 ] timeout 取出并获取列表中的第一个元素,或阻塞,直到有可用 BRPOP key1 [key2 ] timeout 取出并获取列表中的最后一个元素,或阻塞,直到有可用 BRPOPLPUSH source destination timeout 从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用 LINDEX key index 从一个列表其索引获取对应的元素 LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之后或之前插入一个元素 LLEN key 获取列表的长度 LPOP key 获取并取出列表中的第一个元素 LPUSH key value1 [value2] 在前面加上一个或多个值的列表 LPUSHX key value 在前面加上一个值列表,仅当列表中存在 LRANGE key start stop 从一个列表获取各种元素 LREM key count value 从列表中删除元素 LSET key index value 在列表中的索引设置一个元素的值 LTRIM key start stop 修剪列表到指定的范围内 RPOP key 取出并获取列表中的最后一个元素 RPOPLPUSH source destination 删除最后一个元素的列表,将其附加到另一个列表并返回它 RPUSH key value1 [value2] 添加一个或多个值到列表 RPUSHX key value 添加一个值列表,仅当列表中存在 | redis 127.0.0.1:6379> lpush list1 redis (integer) 1 redis 127.0.0.1:6379> lpush list1 hello (integer) 2 redis 127.0.0.1:6379> rpush list1 world (integer) 3 redis 127.0.0.1:6379> llen list1 (integer) 3 redis 127.0.0.1:6379> lrange list1 0 3 1) "hello" 2) "redis" 3) "world" redis 127.0.0.1:6379> lpop list1 "hello" redis 127.0.0.1:6379> rpop list1 "world" redis 127.0.0.1:6379> lrange list1 0 3 1) "redis" |
Set(集合) | SADD key member [member ...] 添加元素 SCARD key 求元素数量 SDIFF key [key ...] 求不存在的元素 SDIFFSTORE destination key [key ...] 求不存在的元素并储为新集 SINTER key [key ...] 求交集 SINTERSTORE destination key [key ...] 求交集并存为新集 SISMEMBER key member 判断在不在集合中 SMEMBERS key 获取集合里面的所有key SMOVE source destination member 移集合中一key到另一集合 SPOP key [count] 获取并删除一个集合里面的元素 SRANDMEMBER key [count] 从集合里面随机获取一个元素 SREM key member [member ...] 从集合里删除指定元素,不存在的忽略 SUNION key [key ...] 添加多个set元素 SUNIONSTORE destination key [key ...] 求并集并存为新集 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素 | redis> SADD myset "Hello" (integer) 1 redis> SADD myset "World" (integer) 1 redis> SMEMBERS myset 1) "World" 2) "Hello" redis> SADD myset "one" (integer) 1 redis> SISMEMBER myset "one" (integer) 1 redis> SISMEMBER myset "two" (integer) 0 使用集合数据结构的典型用例是朋友名单的实现: redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica (integer) 4 redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia (integer) 3 redis 127.0.0.1:6379> sismember friends:leto jessica (integer) 1 #不管一个用户有多少个朋友,我们都能高效地(O(1)时间复杂度)识别出用户X是不是用户Y的朋友 redis 127.0.0.1:6379> sismember friends:leto vladimir (integer) 0 redis 127.0.0.1:6379> sinter friends:leto friends:duncan #我们可以查看两个或更多的人是不是有共同的朋友 1) "paul" 2) "jessica" redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 可以在一个新的关键字里存储结果 (integer) 2 |
Sorted Set(有序集合) | ZADD key score1 member1 [score2 member2] 添加一个或多个成员到有序集合,或者如果它已经存在更新其分数 ZCARD key 得到的有序集合成员的数量 ZCOUNT key min max 计算一个有序集合成员与给定值范围内的分数 ZINCRBY key increment member 在有序集合增加成员的分数 ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,并存储生成一个新的键有序集合。 ZLEXCOUNT key min max 计算一个给定的字典范围之间的有序集合成员的数量 ZRANGE key start stop [WITHSCORES] 由索引返回一个成员范围的有序集合(从低到高) ZRANGEBYLEX key min max [LIMIT offset count]返回一个成员范围的有序集合(由字典范围) ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员,有序集成员按 score 值递增(从小到大)次序排列 ZRANK key member 确定成员的索引中有序集合 ZREM key member [member ...] 从有序集合中删除一个或多个成员,不存在的成员将被忽略 ZREMRANGEBYLEX key min max 删除所有成员在给定的字典范围之间的有序集合 ZREMRANGEBYRANK key start stop 在给定的索引之内删除所有成员的有序集合 ZREMRANGEBYSCORE key min max 在给定的分数之内删除所有成员的有序集合 ZREVRANGE key start stop [WITHSCORES] 返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一个成员范围的有序集合,以socre排序从高到低 ZREVRANK key member 确定一个有序集合成员的索引,以分数排序,从高分到低分 ZSCORE key member 获取给定成员相关联的分数在一个有序集合 ZUNIONSTORE destination numkeys key [key ...] 添加多个集排序,所得排序集合存储在一个新的键 ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相关的分数 | redis 127.0.0.1:6379> zadd dbs 100 redis (integer) 1 redis 127.0.0.1:6379> zadd dbs 98 memcached (integer) 1 redis 127.0.0.1:6379> zadd dbs 99 mongodb (integer) 1 redis 127.0.0.1:6379> zadd dbs 99 leveldb (integer) 1 redis 127.0.0.1:6379> zcard dbs (integer) 4 redis 127.0.0.1:6379> zcount dbs 10 99 (integer) 3 redis 127.0.0.1:6379> zrank dbs leveldb (integer) 1 redis 127.0.0.1:6379> zrank dbs other (nil) redis 127.0.0.1:6379> zrangebyscore dbs 98 100 1) "memcached" 2) "leveldb" 3) "mongodb" 4) "redis" |
Hash(字典,哈希表) | DEL key field[field...] 删除对象的一个或几个属性域,不存在的属性将被忽略 HEXISTS key field 查看对象是否存在该属性域 HGET key field 获取对象中该field属性域的值 HGETALL key 获取对象的所有属性域和值 HINCRBY key field value 将该对象中指定域的值增加给定的value,原子自增操作,只能是integer的属性值可以使用 HINCRBYFLOAT key field increment 将该对象中指定域的值增加给定的浮点数 HKEYS key 获取对象的所有属性字段 HVALS key 获取对象的所有属性值 HLEN key 获取对象的所有属性字段的总数 HMGET key field[field...] 获取对象的一个或多个指定字段的值 HSET key field value 设置对象指定字段的值 HMSET key field value [field value ...] 同时设置对象中一个或多个字段的值 HSETNX key field value 只在对象不存在指定的字段时才设置字段的值 HSTRLEN key field 返回对象指定field的value的字符串长度,如果该对象或者field不存在,返回0. HSCAN key cursor [MATCH pattern] [COUNT count] 类似SCAN命令 | 127.0.0.1:6379> hset person name jack (integer) 1 127.0.0.1:6379> hset person age 20 (integer) 1 127.0.0.1:6379> hset person sex famale (integer) 1 127.0.0.1:6379> hgetall person 1) "name" 2) "jack" 3) "age" 4) "20" 5) "sex" 6) "famale" 127.0.0.1:6379> hkeys person 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hvals person 1) "jack" 2) "20" 3) "famale" |
-
- 两种方式(一般结合使用)
持久化方式 | RDB持久化(Redis Database Backup file) 定时快照,半持久化 | AOF持久化(Append Only File) 日志追加,全持久化 |
含义 | 在指定的时间间隔内将内存中的所有数据生成一份副本并存储到磁盘(dump到rdb文件),实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。 | 以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开AOF文件看到详细的操作记录。 如果两个都配了优先加载AOF。 如果日志过大,Redis可以自动启用日志重写(rewrite)机制。 |
优点 |
| 数据安全性高:更新频率比RDB高。 redis-check-aof工具用来解决崩溃后重启前数据一致性问题。 |
缺点 | 1)数据安全性低:宕机时最近一次持久化后的内存数据变动将丢失。 | 1)AOF文件比RDB文件大,且恢复速度慢。 2)数据集大的时候,比RDB启动效率低。 3)同步频率高导致性能不如RDB |
使用场景 | 做缓存 | |
使用方法 | 1)根据配置进行自动异步快照(6379.conf文件) 配置save M N,意为在M秒内key变动数大于N时就dump内存快照, 例如: save 60 100 #60秒内key变动数大于100时dump内存快照 save 300 1000 #300秒内key变动数大于1000时dump内存快照 save 900 10000 #900秒内key变动数大于10000时dump内存快照 2)手动执行(重启、迁移或手动备份前常用)
执行flushall命令 执行复制(replication)时 | 在Redis的配置文件中存在三种同步方式,它们分别是: appendfsync always #主线程每修改同步(安全但低效) appendfsync everysec #后台线程每秒同步(默认策略) appendfsync no #从不同步(高效但不安全) |
用哪个好
官方推荐两个都启用(会先载入AOF文件恢复数据)
如果对数据不敏感,可以选单独用RDB
不建议单独用AOF,因为可能会出现Bug
如果只是做纯内存缓存,可以都不用
AOF重写
随着写命令不断同步,AOF文件的体积越来越大,将导致AOF恢复耗时。为了解决AOF文件不断膨胀的问题,Redis使用后台进程移除AOF文件中的冗余命令来重写AOF(只保留数据的最新值)。
AOF重写例子 | AOF重写命令 | AOF重写配置示例 | ||||
| bgrewriteaof命令,手动触发,异步执行 | appendonly yes appendfilename "appendonly-${port}.aof" appendfsync everysc dir /bigdiskpath no-appendfsync-on-rwrite yes auto-aof-rewrit-percentage 100 auto-aof-rewrite-min-size 64mb |
混合持久化
当 AOF 在做 rewrite 时,Redis 先以 RDB 格式在 AOF 文件中写入一个数据快照,再把在这期间产生的每一个写命令,追加到 AOF 文件中。
因为 RDB 是二进制压缩写入的,这样 AOF 文件体积就变得更小了。
Redis 4.0 以上版本才支持混合持久化。
混合持久化是对 AOF rewrite 的优化,这意味着使用它必须基于 AOF + AOF rewrite。
主节点(master)实时读写,从节点(slave)实时同步。
可让 slave 分担一部分读请求,提升应用的整体性能。
使用哨兵机制监测master节点,当master节点发生宕机时,哨兵集群自动将 slave 提升为 master 继续提供服务。
参考资料
redis的 rdb 和 aof 持久化的区别_aof 和 rdb 的区别_jackpk的博客-优快云博客
http://www.jb51.net/article/65264.htm
缓存穿透
含义:查询不存在的数据(如查询id=-1的数据)
解决:
- 参数校验:如id<0的直接拦截。
- 布隆过滤器:判断数据是否存在,判断存在不一定存在(哈希相同未必同),判断不存在则一定不存在(哈希不同必不同)。
- 将不存在且攻击频繁的“数据”也存入缓存,key为数据,value为null。
缓存击穿
含义:热点数据缓存过期
解决:
- 设置热点数据永不过期
- 将重新从数据库查询热点数据并更新缓存的代码加互斥锁
缓存雪崩
含义:大批量数据缓存同时过期
解决:
- 缓存数据的过期时间增加随机值
- 新特性
多AOF文件支持 | 7.0 版本中一个比较大的变化就是 aof 文件由一个变成了多个,主要分为两种类型:基本文件(base files)、增量文件(incr files),请注意这些文件名称是复数形式说明每一类文件不仅仅只有一个。在此之外还引入了一个清单文件(manifest) 用于跟踪文件以及文件的创建和应用顺序(恢复) |
config命令增强 | 对于Config Set 和Get命令,支持在一次调用过程中传递多个配置参数。例如,现在我们可以在执行一次Config Set命令中更改多个参数: config set maxmemory 10000001 maxmemory-clients 50% port 6399 |
限制客户端内存使用 Client-eviction | 一旦 Redis 连接较多,再加上每个连接的内存占用都比较大的时候, Redis总连接内存占用可能会达到maxmemory的上限,可以增加允许限制所有客户端的总内存使用量配置项,redis.config 中对应的配置项 // 两种配置形式:指定内存大小、基于 maxmemory 的百分比。 maxmemory-clients 1g maxmemory-clients 10% |
listpack紧凑列表调整 | listpack 是用来替代 ziplist 的新数据结构,在 7.0 版本已经没有 ziplist 的配置了(6.0版本仅部分数据类型作为过渡阶段在使用)listpack 已经替换了 ziplist 类似 hash-max-ziplist-entries 的配置 |
访问安全性增强ACLV2 | 在redis.conf配置文件中,protected-mode默认为yes,只有当你希望你的客户端在没有授权的情况下可以连接到Redis server的时候可以将protected-mode设置为no |
Redis Functions | Redis函数,一种新的通过服务端脚本扩展Redis的方式,函数与数据本身一起存储。 简言之,redis自己要去抢夺Lua脚本的饭碗 |
RDB保存时间调整 | 将持久化文件RDB的保存规则发生了改变,尤其是时间记录频度变化 |
命令新增和变动 | Zset (有序集合)增加 ZMPOP、BZMPOP、ZINTERCARD 等命令 Set (集合)增加 SINTERCARD 命令 LIST (列表)增加 LMPOP、BLMPOP ,从提供的键名列表中的第一个非空列表键中弹出一个或多个元素。 |
性能资源利用率、安全、等改进 | 自身底层部分优化改动,Redis核心在许多方面进行了重构和改进 主动碎片整理V2:增强版主动碎片整理,配合Jemalloc版本更新,更快更智能,延时更低 HyperLogLog改进:在Redis5.0中,HyperLogLog算法得到改进,优化了计数统计时的内存使用效率,7更加优秀 更好的内存统计报告 如果不为了API向后兼容,我们将不再使用slave一词......(政治正确) |