Redis

Redis(REmote DIctionary Server远程字典服务器)是一个开源的基于内存的键值型NoSQL,使用ANSI C语言编写、遵守BSD协议、支持网络、支持持久化,命令单线程型,日志型,并提供多种语言的API。

参考网站

官网: RedisRedis | The Real-time Data Platform

中文网: Redis中文学习网 - Redis开发与运维技术、Redis教程、使用手册CRUG网站http://www.redisfans.com/

源码: GitHub - redis/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps.

在线测试: Try Redis

作者网站: antirez (Salvatore Sanfilippo) · GitHubList 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以上。

    1. 安装

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服务进行交互

参考:在 windows 上安装 Redis

    1. 的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类型。

ValueHashMap,实际这里会有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"

    1. 两种方式一般结合使用

持久化方式

RDB持久化(Redis Database Backup file)

定时快照,半持久化

AOF持久化(Append Only File)

日志追加,全持久化

含义

在指定的时间间隔内将内存中的所有数据生成一份副本并存储到磁盘(dump到rdb文件),实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开AOF文件看到详细的操作记录。

如果两个都配了优先加载AOF。

如果日志过大,Redis可以自动启用日志重写(rewrite)机制。

优点

  1. 单个文件dump.rdb,操作简单,容灾性好,一个文件可以保存到安全的磁盘
  2. 文件体积小(二进制+压缩)
  3. fork子进程进行持久化,不影响主进程,性能好
  4. 如果数据集很大,启动效率比AOF高

数据安全性高:更新频率比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)手动执行(重启、迁移或手动备份前常用)

  1. 执行save命令:主进程同步执行,阻塞所有命令,数据迁移前用。
  2. 执行bgsave命令:子进程异步执行,不影响主进程处理用户请求,执行后会立即返回ok表示开始执行,可在执行前后通过lastsave命令查询时间戳来判断是否执行完成。

执行flushall命令

执行复制(replication)时

在Redis的配置文件中存在三种同步方式,它们分别是:

appendfsync always     #主线程每修改同步(安全但低效)

appendfsync everysec   #后台线程每秒同步(默认策略)

appendfsync no         #从不同步(高效但不安全)

用哪个好

官方推荐两个都启用(会先载入AOF文件恢复数据)

如果对数据不敏感,可以选单独用RDB

不建议单独用AOF,因为可能会出现Bug

如果只是做纯内存缓存,可以都不用

AOF重写

随着写命令不断同步,AOF文件的体积越来越大,将导致AOF恢复耗时。为了解决AOF文件不断膨胀的问题,Redis使用后台进程移除AOF文件中的冗余命令来重写AOF(只保留数据的最新值)。

AOF重写例子

AOF重写命令

AOF重写配置示例

原生AOF

AOF重写

set hello world

set hello java

set hello redis

incr counter

incr counter

rpush mylist a

rpush mylist b

rpush mylist c

过期数据

set hello redis

set counter 2

rpush mylist a b c

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的博客-CSDN博客

http://www.jb51.net/article/65264.htm

缓存穿透

含义:查询不存在的数据(如查询id=-1的数据)

解决:

  1. 参数校验:如id<0的直接拦截。
  2. 布隆过滤器:判断数据是否存在,判断存在不一定存在(哈希相同未必同),判断不存在则一定不存在(哈希不同必不同)。
  3. 将不存在且攻击频繁的“数据”也存入缓存,key为数据,value为null。

缓存击穿

含义:热点数据缓存过期

解决:

  1. 设置热点数据永不过期
  2. 将重新从数据库查询热点数据并更新缓存的代码加互斥锁

缓存雪崩

含义:大批量数据缓存同时过期

解决:

  1. 缓存数据的过期时间增加随机值
    1. 新特性

多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一词......(政治正确)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值