zvvq技术分享网

深入分析Redis(深入分析原因,找出问题根源并有

作者:zvvq博客网
导读推荐(免费): /" target="_blank" redis="" 1 Redis简介 什么是Redis Redis是完全开源免费的,遵守BSD协议,是⼀个⾼性能(NOSQL)的 key-value数据库 。Redis是⼀个开源的使⽤ANSI C语⾔编写、⽀持⽹

本文来自zvvq

推荐(免费):

zvvq好,好zvvq

1 Redis简介

什么是Redis Redis是完全开源免费的,遵守BSD协议,是⼀个⾼性能(NOSQL)的key-value数据库。Redis是⼀个开源的使⽤ANSI C语⾔编写、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value数据库,并提供多种语⾔的API。 内容来自samhan666

1

copyright zvvq

2 内容来自samhan666

3 zvvq

4 本文来自zvvq

5

本文来自zvvq

6 内容来自zvvq

BSD是“Berkeley Software Distribution”的缩写,意思是“伯克利软件发⾏版”。

内容来自samhan

BSD开源协议是⼀个给与使⽤者很⼤⾃由的协议。可以⾃由的使⽤,修改源代码,也可以将修改后的代码作 内容来自zvvq

为开源或者专有软件再发布。 zvvq

BSD由于允许使⽤者修改或者重新发布代码,也允许使⽤或在BSD代码上开发商业软件发布和销售,因此是 内容来自samhan

对商业集成很友好的协议。

本文来自zvvq

Linux:Ubuntu Redhat Centos 本文来自zvvq

Nosql: zvvq

1

zvvq

2

zvvq好,好zvvq

Nosql, 泛指⾮关系型数据库,Nosql即Not-only SQL,他作为关系型数据库的良好补充。随着互联⽹的

内容来自zvvq,别采集哟

兴起,⾮关系型数据库现在成为了⼀个极其热⻔的新领域,⾮关系型数据库产品的发展⾮常迅速 zvvq

2 Redis安装 zvvq

2.1 安装前准备

内容来自zvvq

Redis官⽹ 内容来自zvvq,别采集哟

官⽅⽹站:http://redis.io zvvq好,好zvvq

中⽂官⽹:http://redis.cn

copyright zvvq

官⽅⽹站下载:http://redis.io/download

Redis 安装

zvvq好,好zvvq

Linux 内容来自samhan666

Redis是C语⾔开发,安装Redis需要先将官⽹下载的源码进⾏编译,编译依赖GCC环境,如果没有GCC环境,需要安装GCC

1 内容来自zvvq,别采集哟

2 zvvq

3

本文来自zvvq

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz zvvq好,好zvvq

$ tar xzf redis-5.0.5.tar.gz

内容来自samhan

$ cd redis-5.0.5$ make

zvvq好,好zvvq

Windows

zvvq.cn

直接解压即可

copyright zvvq

建议redis安装的⽬录增加到环境变量

2.2 Redis的启动

内容来自zvvq,别采集哟

Linux启动Redis服务端

zvvq好,好zvvq

进⼊对应的安装⽬录 内容来自zvvq

1

内容来自samhan

cd /usr/local/redis

zvvq好,好zvvq

执⾏命令 zvvq好,好zvvq

1

copyright zvvq

./bin/redis-server

内容来自zvvq,别采集哟

内容来自samhan666

Linux启动Redis客户端 内容来自samhan

1 zvvq好,好zvvq

./bin/redis-cli

内容来自zvvq,别采集哟

Windows启动Redis服务端

zvvq好,好zvvq

进⼊对应的安装⽬录,打开命令窗⼝

内容来自samhan

执⾏命令

1 zvvq好,好zvvq

redis-server redis.window.conf zvvq.cn

内容来自samhan666

Windows启动Redis客户端 zvvq好,好zvvq

进⼊对应的安装⽬录,打开命令窗⼝ 内容来自samhan666

执⾏命令

1

zvvq.cn

redis-cli

内容来自samhan666

客户端启动成功之后的图: 内容来自zvvq

3 Redis核⼼配置⽂件Redis.conf

内容来自samhan666

1

zvvq.cn

2

zvvq.cn

3

内容来自samhan

4

zvvq.cn

5

内容来自samhan

6

内容来自samhan

7 zvvq

8 zvvq好,好zvvq

9

copyright zvvq

10 copyright zvvq

11

本文来自zvvq

12

zvvq好,好zvvq

13

copyright zvvq

14

内容来自zvvq

15 内容来自zvvq

16 内容来自zvvq,别采集哟

17 内容来自samhan666

18

内容来自zvvq

19

内容来自samhan

20 zvvq.cn

21 内容来自samhan666

22

zvvq

23 内容来自zvvq,别采集哟

24

zvvq好,好zvvq

25

内容来自samhan

*1. Redis 默认不是以守护进程的⽅式运⾏,可以通过该配置项修改,使⽤yes启动守护进程

zvvq.cn

daemonize no2. 当客户端闲置多⻓时间后关闭连接(单位是秒)

内容来自samhan

timeout 300*3. 指定Redis监听端⼝,默认端⼝为6379,作者在⼀⽚博⽂中解释了为什么选⽤6379作为默认端⼝,因 内容来自samhan666

为6379在⼿机按键上MERZ对应的号码,⽽MERZ取⾃意⼤利歌⼿Alessia Merz的名字

内容来自samhan

port 6379*4. 绑定的主机地址 zvvq

bind 127.0.0.1

内容来自samhan666

5. 指定⽇志记录级别,Redis共⽀持四个级别:debug、verbose、notice、warning

内容来自samhan

loglevel verbose6. 数据库数量(单机环境下),默认数据库为0,可以使⽤select <dbid>命令在连接上指定数据库id zvvq好,好zvvq

databases 16// ⾮常重要*7. RDB 持久化策略,指定在多⻓时间内,有多少次更新操作,就将数据同步到数据⽂件,可以多个条件 zvvq.cn

配合 copyright zvvq

save <seconds> <changes>

内容来自zvvq,别采集哟

Redis默认配置⽂件提供了三个条件

内容来自zvvq

save 900 1

内容来自zvvq

save 300 10 内容来自zvvq

save 60 100008. 持久化⽂件名 内容来自samhan666

dbfilename dump.rdb*9. 指定存储⾄本地数据库时是否压缩数据,默认为yes,Redis采⽤LZF(压缩算法)压缩,如果为了节 zvvq.cn

省CPU时间,可以关闭该选项,但会导致数据库⽂件变得巨⼤ zvvq好,好zvvq

rdbcompression yes*10. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis的时候需要通过 AUTH<password> 命令提供密码,默认关闭

zvvq好,好zvvq

requirepass foobared// AOF 配置*11. 指定是否在每次操作后进⾏⽇志记录,Redis在默认情况下是关闭的

内容来自samhan666

appendonly no*12. AOF⽂件的名字

copyright zvvq

appendfilename "appendonly.aof"*13. aof策略,分为三种,always表示每次操作都会记录⽇志,everysec表示每秒记录⼀次⽇志,no表 内容来自samhan

示不记录⽇志

内容来自samhan666

# appendfsync always zvvq

appendfsync everysec

内容来自samhan666

# appendfsync no</password></changes></seconds></dbid>

zvvq

Redis持久化总结:

copyright zvvq

RDB:是Redis默认的持久化机制。RDB相当于照快照

内容来自samhan666

,保存的是⼀种状态。⼏⼗GB的数据 ------> ⼏KB

copyright zvvq

的快照

快照是默认的持久化⽅式,这种⽅式是就是将内存中数据以快照的⽅式写⼊到⼆进制⽂件中,默认的⽂件名为dump.rdb。

内容来自zvvq

优点:快照保存数据极快、还原数据极快 本文来自zvvq

适⽤于容灾备份

缺点:⼩内存机器不适合使⽤,RDB机制符合要求就会照快照,可能会丢失数据 zvvq

快照条件:

内容来自zvvq,别采集哟

1、服务器正常关闭时 ./bin/redis-cli shutdown 内容来自zvvq

2、key满⾜⼀定条件,会进⾏快照 内容来自zvvq,别采集哟

AOF:由于快照⽅式是在⼀定时间间隔内做⼀次的,那么如果redis意外down掉的话,就会丢失最后⼀次快照后的所有修改。如果应⽤要求不能丢失任何修改的话,可以采取aof持久化⽅式。 本文来自zvvq

Append-only file:aof ⽐快照⽅式有更好的持久化性,是由于在使⽤aof持久化⽅式时,redis会将每⼀个收到的写命令都通过write函数追加到⽂件中(默认appendonly.aof)。当redis重启时会通过执⾏⽂件中保存的写命令来在内存中重建整个数据库的内容。

zvvq

有三种⽅式如下:(默认是每秒⼀次) 内容来自zvvq

appendonly yes 启⽤aof持久化⽅式

zvvq.cn

appendsync always 收到写命令就⽴即写⼊磁盘,最慢,但是保证完全的持久化 内容来自zvvq,别采集哟

appendsync 每秒钟写⼊磁盘⼀次,在性能和持久化⽅⾯做了很好的折中 内容来自zvvq,别采集哟

appendsync no 完全依赖os,性能最好,持久化没有保证

4 Redis常⽤数据类型以及应⽤场景 zvvq.cn

Redis⽀持五种数据类型:String(字符串),hash(哈希),list(列表),set(集合)以及 zset(sorted set:有序集合) 等 zvvq

4.1 String

内容来自samhan

string是Redis最基本的类型,⼀个key对应⼀个value,⼀个键最⼤能存储512MB。 内容来自samhan666

string类型是⼆进制安全的。意思是Redis的string可以包含任何数据。⽐如jpg图⽚或者序列化对象。 copyright zvvq

⼆进制安全是指,在传输数据时,保证⼆进制数据的信息安全,也就是不被篡改、破译等,如果有被攻

内容来自zvvq

击,能够及时检测出来

跟之前的map ⾮常类似。Value是字符串。

copyright zvvq

1 zvvq.cn

2

内容来自samhan666

3 内容来自samhan666

4

内容来自zvvq

5

内容来自zvvq,别采集哟

SET key value

内容来自samhan

GET key

zvvq

INCR 可以对应的key的数值(整型的数值)加⼀( 原⼦操作)INCRBY 给数值加上⼀个步⻓ 内容来自zvvq

SETEX expire 过期 内容来自samhan666

SETNX not exist key不存在的时候再去赋值 copyright zvvq

应⽤场景:很常⻅的场景⽤于统计⽹站访问数量 pv(Page view),当前在线⼈数等。incr命令(++操 作) copyright zvvq

4.2 List

本文来自zvvq

Redis的列表允许⽤户从序列的两端推⼊或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为o(1),获取越接近两端的元素速度就越快。这意味着即使是⼀个有⼏千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最⼤元素数量是4294967295。

内容来自zvvq

1 内容来自samhan666

2

内容来自samhan

3

zvvq.cn

4 zvvq

5 内容来自samhan666

6 本文来自zvvq

7 本文来自zvvq

8 内容来自zvvq

9

内容来自zvvq

10 内容来自samhan

11 内容来自samhan666

操作命令:

本文来自zvvq

LPUSH 后⾯的元素放在栈顶 内容来自zvvq,别采集哟

LPOP 返回第⼀个元素,并且在列表上删除该元素 (栈顶)

zvvq好,好zvvq

LLEN 返回当前的list列表的⻓度 zvvq

LINDEX 返回当前的list的指定index下标的元素。没有返回nil,0表示栈顶的元素 内容来自zvvq

LINSERT 插⼊的位置是按照index的顺序,Before的话得注意 index的值

zvvq.cn

LPUSHX 如果list存在,再去push zvvq好,好zvvq

LRANGE 可以⽅便的查看某个index范围内的list的值。输⼊的index是从0开始,显示的标号是从1开始的。 内容来自zvvq

LREM 删除list⾥的指定的前⼏个(指定value的)元素

本文来自zvvq

删除指定位置的元素:没有 内容来自zvvq

LSET 设置指定的位置的元素的值 (修改) 输⼊的index是从0开始,显示的标号是从1开始的。 内容来自zvvq,别采集哟

应⽤场景:1.最新消息排⾏榜。2.消息队列,以完成多程序之间的消息交换。可以⽤push操作将任务存

内容来自samhan666

在list中(⽣产者),然后线程在⽤pop操作将任务取出进⾏执⾏。(消费者)

4.3 Hash (⼆维表)

本文来自zvvq

Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到⼀个key中。每⼀个Hash可以存储4294967295个键值对。

本文来自zvvq

1

内容来自samhan

2 内容来自zvvq

3

zvvq好,好zvvq

4

zvvq

5

本文来自zvvq

6

zvvq.cn

7

zvvq好,好zvvq

8

zvvq

9 内容来自samhan

10 内容来自samhan

11 内容来自zvvq,别采集哟

12 内容来自samhan666

13 zvvq

14 zvvq.cn

15

本文来自zvvq

16

内容来自samhan666

17

zvvq

18

内容来自samhan666

19 内容来自zvvq

20

本文来自zvvq

21

zvvq好,好zvvq

22 zvvq

23 内容来自samhan666

24 copyright zvvq

25 内容来自samhan

26

zvvq好,好zvvq

27

zvvq.cn

28

内容来自zvvq,别采集哟

29 内容来自samhan

30

zvvq

31

内容来自samhan

32 zvvq好,好zvvq

33 zvvq.cn

34

zvvq.cn

35 本文来自zvvq

36 内容来自zvvq

37

zvvq.cn

38

内容来自zvvq

39

内容来自samhan666

40

内容来自zvvq

41

zvvq好,好zvvq

42 内容来自zvvq

43

内容来自zvvq

44 zvvq

45 zvvq.cn

46 内容来自samhan666

47

zvvq

48 copyright zvvq

49 内容来自zvvq

50

内容来自zvvq

51

zvvq

52

内容来自zvvq,别采集哟

53 本文来自zvvq

54

内容来自zvvq

HSET

copyright zvvq

HSET key field value zvvq好,好zvvq

将哈希表 key 中的域 field 的值设为 value 。 本文来自zvvq

如果 key 不存在,⼀个新的哈希表被创建并进⾏ HSET 操作。

本文来自zvvq

如果域 field 已经存在于哈希表中,旧值将被覆盖。

内容来自samhan666

HGET 返回哈希表 key 中给定域 field 的值。如果不存在,返回nil 本文来自zvvq

HEXISTS

内容来自samhan

HEXISTS key field 本文来自zvvq

查看哈希表 key 中,给定域 field 是否存在。

内容来自zvvq

HGETALL

本文来自zvvq

HGETALL key 内容来自zvvq,别采集哟

返回哈希表 key 中,所有的域和值。 zvvq

在返回值⾥,紧跟每个域名(field name)之后是域的值(value),所以返回值的⻓度是哈希表⼤⼩的

内容来自samhan666

两倍。 内容来自samhan666

HKEYS

内容来自zvvq

HKEYS key

内容来自samhan666

返回哈希表 key 中的所有值。

zvvq好,好zvvq

HLEN copyright zvvq

返回哈希表 key 中值的数量。 zvvq好,好zvvq

HVALS

copyright zvvq

HVALS key

zvvq.cn

返回哈希表 key 中所有域的值。

zvvq好,好zvvq

HINCRBY

copyright zvvq

HINCRBY key field increment 内容来自samhan666

为哈希表 key 中的域 field 的值加上增量 increment 。

内容来自zvvq,别采集哟

增量也可以为负数,相当于对给定域进⾏减法操作。 内容来自zvvq,别采集哟

如果 key 不存在,⼀个新的哈希表被创建并执⾏ HINCRBY 命令。 本文来自zvvq

如果域 field 不存在,那么在执⾏命令前,域的值被初始化为 0 。 zvvq好,好zvvq

对⼀个储存字符串值的域 field 执⾏ HINCRBY 命令将造成⼀个错误。 zvvq.cn

本操作的值被限制在 64 位(bit)有符号数字表示之内。 copyright zvvq

HMGET

zvvq

HMGET key field [field ...]返回哈希表 key 中,⼀个或多个给定域的值。

copyright zvvq

如果给定的域不存在于哈希表,那么返回⼀个 nil 值。 zvvq

因为不存在的 key 被当作⼀个空哈希表来处理,所以对⼀个不存在的 key 进⾏ HMGET 操作将 内容来自zvvq

返回⼀个只带有 nil 值的表。

zvvq

HMSET

内容来自samhan

HMSET key field value [field value ...]同时将多个 field-value (域-值)对设置到哈希表 key 中。 内容来自zvvq

此命令会覆盖哈希表中已存在的域。 zvvq

如果 key 不存在,⼀个空哈希表被创建并执⾏ HMSET 操作。

内容来自samhan666

HSETNX 内容来自samhan666

HSETNX key field value

内容来自samhan

将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。

zvvq.cn

若域 field 已经存在,该操作⽆效。 本文来自zvvq

如果 key 不存在,⼀个新哈希表被创建并执⾏ HSETNX 命令。

copyright zvvq

应⽤场景:例如存储、读取、修改⽤户属性(name,age,pwd等)

内容来自zvvq,别采集哟

4.4 Set(⽆序集合)

内容来自samhan666

1

内容来自samhan

2

内容来自samhan

3

内容来自samhan666

4 内容来自zvvq,别采集哟

5

内容来自samhan

6

copyright zvvq

7 zvvq

8 zvvq好,好zvvq

9

本文来自zvvq

10 内容来自zvvq

11 内容来自samhan666

12 本文来自zvvq

13 zvvq好,好zvvq

14

内容来自samhan666

15 zvvq好,好zvvq

16 copyright zvvq

17 zvvq好,好zvvq

18

copyright zvvq

19

内容来自zvvq

20

内容来自zvvq,别采集哟

21

zvvq好,好zvvq

22

内容来自samhan666

23 内容来自zvvq,别采集哟

24 内容来自zvvq,别采集哟

25 zvvq

26 内容来自samhan

27

copyright zvvq

28 zvvq

29 copyright zvvq

30

内容来自samhan666

31 内容来自samhan

32

本文来自zvvq

33

本文来自zvvq

34 copyright zvvq

35 copyright zvvq

36

zvvq好,好zvvq

37 copyright zvvq

38 内容来自zvvq

39

zvvq.cn

40

zvvq好,好zvvq

41

zvvq好,好zvvq

42 zvvq

43 copyright zvvq

44 内容来自samhan

45

本文来自zvvq

46 zvvq

47 zvvq.cn

48

内容来自samhan666

49

本文来自zvvq

SADD

内容来自samhan666

SADD key member [member ...]将⼀个或多个 member 元素加⼊到集合 key 当中,已经存在于集合的 member 元素将被忽略。

内容来自zvvq

假如 key 不存在,则创建⼀个只包含 member 元素作成员的集合。 zvvq

当 key 不是集合类型时,返回⼀个错误。

内容来自samhan

SMEMBERS 内容来自samhan666

SMEMBERS key

本文来自zvvq

返回集合 key 中的所有成员。

内容来自samhan666

不存在的 key 被视为空集合。 内容来自samhan

SISMEMBER zvvq.cn

SISMEMBER key member

zvvq

判断 member 元素是否集合 key 的成员。

内容来自zvvq

SCARD

zvvq.cn

SCARD key

copyright zvvq

返回集合 key 的基数(集合中元素的数量)。

本文来自zvvq

SPOP (弹出并从集合删除)

copyright zvvq

SPOP key 内容来自samhan

移除并返回集合中的⼀个随机元素。 内容来自zvvq,别采集哟

如果只想获取⼀个随机元素,但不想该元素从集合中被移除的话,可以使⽤ SRANDMEMBER 命

内容来自samhan

令。

zvvq.cn

SRANDMEMBER

本文来自zvvq

SRANDMEMBER key [count]如果命令执⾏时,只提供了 key 参数,那么返回集合中的⼀个随机元素。

copyright zvvq

随机取出 count个元素(不删除) 内容来自samhan

SINTER 内容来自samhan

SINTER key [key ...]返回⼀个集合的全部成员,该集合是所有给定集合的交集。

copyright zvvq

不存在的 key 被视为空集。

内容来自samhan

SINTERSTORE 本文来自zvvq

SINTERSTORE destination key [key ...]这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,⽽不是简单地返回结果

内容来自samhan666

集。 内容来自samhan

如果 destination 集合已经存在,则将其覆盖。 内容来自zvvq

SUNION 内容来自samhan666

SUNION key [key ...]返回⼀个集合的全部成员,该集合是所有给定集合的并集。

内容来自samhan

不存在的 key 被视为空集。

本文来自zvvq

SUNIONSTORE

内容来自zvvq

SUNIONSTORE destination key [key ...]这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,⽽不是简单地返回结果

zvvq.cn

集。 内容来自zvvq

如果 destination 已经存在,则将其覆盖。 内容来自zvvq,别采集哟

SDIFF

内容来自samhan

SDIFF key [key ...]返回⼀个集合的全部成员,该集合是所有给定集合之间的差集。

zvvq.cn

不存在的 key 被视为空集。 zvvq

SDIFFSTORE

zvvq

SDIFFSTORE destination key [key ...]这个命令的作⽤和 SDIFF 类似,但它将结果保存到 destination 集合,⽽不是简单地返回结果

内容来自samhan666

集。

内容来自zvvq

如果 destination 集合已经存在,则将其覆盖。 destination 可以是 key 本身。 内容来自zvvq

SMOVE zvvq

SMOVE source destination member 内容来自samhan666

将 member 元素从 source 集合移动到 destination 集合。SMOVE 是原⼦性操作。

zvvq

SREM 删除

内容来自zvvq

SREM key member [member ...]移除集合 key 中的⼀个或多个 member 元素,不存在的 member 元素会被忽略。 内容来自zvvq

当 key 不是集合类型,返回⼀个错误。

内容来自zvvq

应⽤场景:

内容来自samhan

1.利⽤交集求共同好友。 内容来自zvvq

2.利⽤唯⼀性,可以统计访问⽹站的所有独⽴IP。 内容来自zvvq

3.好友推荐的时候根据tag求交集,⼤于某个threshold(临界值的)就可以推荐。 内容来自samhan

4.5 SortSet(有序集合)

1

本文来自zvvq

2 copyright zvvq

3

zvvq好,好zvvq

4

zvvq

5 内容来自zvvq

6

zvvq好,好zvvq

7 zvvq.cn

8 copyright zvvq

9

本文来自zvvq

10 zvvq好,好zvvq

11

zvvq.cn

12

本文来自zvvq

13

内容来自zvvq

14 内容来自zvvq

15

本文来自zvvq

16

内容来自samhan

17

内容来自zvvq

18

内容来自samhan666

19 内容来自zvvq,别采集哟

20 本文来自zvvq

21 zvvq好,好zvvq

22

本文来自zvvq

23

zvvq好,好zvvq

24 zvvq.cn

25 zvvq

26

内容来自samhan

27

zvvq.cn

28 内容来自zvvq

29 内容来自zvvq,别采集哟

30

本文来自zvvq

31

copyright zvvq

32 本文来自zvvq

33 内容来自samhan666

34

zvvq好,好zvvq

35 本文来自zvvq

36

内容来自samhan

37 zvvq

38 内容来自samhan666

39 内容来自samhan

40

内容来自zvvq,别采集哟

41 zvvq.cn

42 内容来自zvvq,别采集哟

43 内容来自samhan666

44

copyright zvvq

45

zvvq

46

zvvq

47 zvvq

48 内容来自samhan666

49 内容来自zvvq

50 copyright zvvq

51 zvvq.cn

52

copyright zvvq

53 内容来自samhan666

54 zvvq.cn

55

内容来自samhan666

56

内容来自zvvq,别采集哟

57

内容来自samhan

58

zvvq好,好zvvq

59 本文来自zvvq

60

zvvq

61 copyright zvvq

62 zvvq.cn

63 zvvq.cn

ZADD

zvvq

ZADD key score member [[score member] [score member] ...]将⼀个或多个 member 元素及其 score 值加⼊到有序集 key 当中。

内容来自samhan666

ZCARD

zvvq好,好zvvq

ZCARD key

zvvq

返回有序集 key 的基数。

本文来自zvvq

ZSCORE

zvvq

ZSCORE key member

内容来自samhan666

返回有序集 key 中,成员 member 的 score 值。 copyright zvvq

如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 zvvq.cn

ZCOUNT (闭区间)

内容来自samhan

ZCOUNT key min max zvvq

返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的

内容来自samhan

成员的数量。

本文来自zvvq

关于参数 min 和 max 的详细使⽤⽅法,请参考 ZRANGEBYSCORE 命令。

zvvq.cn

ZINCRBY zvvq

ZINCRBY key increment member

内容来自samhan

为有序集 key 的成员 member 的 score 值加上增量 increment 。

内容来自zvvq

ZRANGE

内容来自zvvq,别采集哟

ZRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。

内容来自samhan

其中成员的位置按 score 值递增(从⼩到⼤)来排序。

内容来自samhan

具有相同 score 值的成员按字典序(lexicographical order )来排列。 zvvq

ZRANGEBYSCORE

zvvq好,好zvvq

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有 本文来自zvvq

序集成员按 score 值递增(从⼩到⼤)次序排列。

内容来自zvvq

根据指定的分值范围去查找 zvvq好,好zvvq

ZRANK (排名从0开始)

zvvq

ZRANK key member 内容来自zvvq

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从⼩到⼤)顺序排

zvvq.cn

列。

本文来自zvvq

ZREVRANGE

内容来自zvvq

ZREVRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。 本文来自zvvq

其中成员的位置按 score 值递减(从⼤到⼩)来排列。

zvvq

具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。

zvvq.cn

ZREVRANGEBYSCORE

内容来自samhan

ZREVRANGE key start stop [WITHSCORES]返回有序集 key 中,指定区间内的成员。

zvvq.cn

ZREVRANK 本文来自zvvq

ZREVRANK key member

内容来自samhan666

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从⼤到⼩)排序。 内容来自zvvq,别采集哟

排名以 0 为底,也就是说, score 值最⼤的成员排名为 0 。

zvvq.cn

使⽤ ZRANK 命令可以获得成员按 score 值递增(从⼩到⼤)排列的排名。 本文来自zvvq

ZREM

内容来自samhan

ZREM key member [member ...]移除有序集 key 中的⼀个或多个成员,不存在的成员将被忽略。

zvvq

当 key 存在但不是有序集类型时,返回⼀个错误。

zvvq

ZREMRANGEBYRANK

zvvq好,好zvvq

ZREMRANGEBYRANK key start stop 内容来自samhan666

移除有序集 key 中,指定排名(rank)区间内的所有成员。

zvvq.cn

区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。

zvvq好,好zvvq

ZREMRANGEBYSCORE 内容来自samhan

ZREMRANGEBYSCORE key min max 内容来自samhan

移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 zvvq

应⽤场景:可以⽤于⼀个⼤型在线游戏的积分排⾏榜,每当玩家的分数发⽣变化时,可以执⾏zadd更新 zvvq好,好zvvq

玩家分数(score),此后在通过zrange获取⼏分top ten的⽤户信息。

5 Redis的整合(Jedis) Java for Redis 内容来自zvvq

5.1 导包 zvvq.cn

1 zvvq.cn

2

内容来自samhan666

3 内容来自zvvq,别采集哟

4

内容来自samhan666

<dependency>

内容来自samhan

<groupid>redis.clients</groupid>

zvvq好,好zvvq

<artifactid>jedis</artifactid>

内容来自samhan

<version>2.9.0</version></dependency> 内容来自samhan666

5.2 配置 本文来自zvvq

1

内容来自samhan666

2 zvvq.cn

3

内容来自samhan

4 zvvq.cn

5

内容来自zvvq,别采集哟

6

内容来自zvvq,别采集哟

7 本文来自zvvq

@Configurationpublic class RedisConfig { 本文来自zvvq

@Bean

本文来自zvvq

public Jedis jedis(){

内容来自samhan666

Jedis jedis = new Jedis("localhost", 6379); zvvq.cn

return jedis; 本文来自zvvq

}} 内容来自samhan

5.3 使⽤ 内容来自samhan

1 zvvq

// 直接引⼊ @Autowiredprivate Jedis jedis;// 使⽤ 和在命令⾏客户端操作是⼀样的jedis.set();jedis.get();jedis.hset();jedis.hget();jedis.sadd();...

内容来自zvvq,别采集哟

6 Springboot2.x中Redis进⾏连接(RedisTemplate) 内容来自zvvq,别采集哟

RedisTemplate 简介,SpringBoot对Redis进⾏了⼀层模板化的封装,⽅便我们对对象进⾏操作。底层 copyright zvvq

在SpringBoot1.x的时候使⽤的是Jedis,在Springboot2.x后使⽤的是lettuce。

6.1 导包

zvvq好,好zvvq

1

zvvq.cn

2

zvvq好,好zvvq

3 本文来自zvvq

4 zvvq

5 内容来自samhan

6 内容来自samhan666

7

内容来自samhan666

8

内容来自zvvq,别采集哟

9 zvvq.cn

<dependency> 内容来自zvvq,别采集哟

<groupid>org.springframework.boot</groupid>

内容来自zvvq

<artifactid>spring-boot-starter-data-redis</artifactid></dependency><!-- 序列化 --><dependency>

内容来自samhan

<groupid>com.fasterxml.jackson.core</groupid> 内容来自zvvq,别采集哟

<artifactid>jackson-core</artifactid> zvvq好,好zvvq

<version>2.10.0</version></dependency> <dependency> zvvq好,好zvvq

<groupid>com.fasterxml.jackson.core</groupid>

内容来自zvvq,别采集哟

<artifactid>jackson-databind</artifactid>

本文来自zvvq

<version>2.10.0</version></dependency> 本文来自zvvq

6.2 配置

内容来自zvvq

1

内容来自samhan

2

本文来自zvvq

3

内容来自zvvq

4

本文来自zvvq

5 本文来自zvvq

6 zvvq好,好zvvq

7 内容来自samhan666

8

zvvq好,好zvvq

9

内容来自samhan

10 内容来自zvvq,别采集哟

11 内容来自zvvq

12

内容来自zvvq

13

本文来自zvvq

14

内容来自zvvq

15

内容来自samhan

16

zvvq好,好zvvq

17

内容来自samhan

18

内容来自samhan

19

zvvq.cn

20

内容来自samhan

21 内容来自samhan666

22

copyright zvvq

23

copyright zvvq

24

内容来自samhan

@Configurationpublic class RedisConfig { 内容来自samhan666

@Bean copyright zvvq

public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ 内容来自zvvq

RedisTemplate redisTemplate = new RedisTemplate(); 内容来自zvvq,别采集哟

redisTemplate.setConnectionFactory(redisConnectionFactory);

内容来自samhan

//定制化模板

zvvq

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 内容来自zvvq,别采集哟

redisTemplate.setKeySerializer(stringRedisSerializer); 本文来自zvvq

// 设置value JackSon序列化⽅式 zvvq好,好zvvq

Jackson2JsonRedisSerializer jsonRedisSerializer = new  Jackson2JsonRedisSerializer(Object.class); zvvq好,好zvvq

ObjectMapper objectMapper = new ObjectMapper(); 本文来自zvvq

// 对于不是基本类型的变量显示全类名

本文来自zvvq

objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

zvvq

//设置值的属性可⻅

内容来自zvvq,别采集哟

objectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.AN

zvvq.cn

Y);

zvvq好,好zvvq

jsonRedisSerializer.setObjectMapper(objectMapper);

内容来自zvvq

redisTemplate.setValueSerializer(jsonRedisSerializer);

内容来自samhan

return redisTemplate; 内容来自zvvq

}}

内容来自samhan666

6.3 使⽤

内容来自zvvq,别采集哟

1 内容来自zvvq,别采集哟

2

内容来自zvvq,别采集哟

3 zvvq好,好zvvq

4

本文来自zvvq

5

zvvq.cn

redisTemplate.opsForValue().set(); zvvq.cn

redisTemplate.opsForHash().put(); 内容来自zvvq

redisTemplate.opsForList().leftPush(); 内容来自zvvq,别采集哟

redisTemplate.opsForSet().add();

本文来自zvvq

redisTemplate.opsForZSet().add();

内容来自samhan666

7 Springboot2.x中使⽤Redisson进⾏连接 zvvq

Redisson

内容来自zvvq,别采集哟

:Redisson是⼀个在Redis的基础上实现的Java驻内存数据⽹格(In-Memory Data Grid)。它不仅提供了⼀系列的分布式的Java常⽤对象,还提供了许多分布式服务。其中包括( BitSet , Set ,

copyright zvvq

Multimap , SortedSet , Map , List , Queue , BlockingQueue , Deque , BlockingDeque ,Semaphore , Lock , AtomicLong , CountDownLatch , Publish / Subscribe , Bloom filter ,Remote service , Spring cache , Executor service , Live Object service , Scheduler service ) Redisson提供了使⽤Redis的最简单和最便捷的⽅法。Redisson的宗旨是促进使⽤者对Redis的关注分离(Separation of Concern),从⽽让使⽤者能够将精⼒更集中地放在处理业务逻辑上。

开源地址:https://github.com/redisson/redisson 内容来自samhan666

7.1 导包

内容来自zvvq

1 zvvq

2

zvvq好,好zvvq

3

copyright zvvq

4

内容来自samhan666

<dependency>

内容来自zvvq

<groupid>org.redisson</groupid> 本文来自zvvq

<artifactid>redisson</artifactid>

内容来自samhan666

<version>3.5.7</version></dependency>

内容来自samhan666

7.2 配置

zvvq.cn

1

copyright zvvq

2 zvvq.cn

3

zvvq

4 内容来自zvvq,别采集哟

5 zvvq

6

zvvq好,好zvvq

7

内容来自zvvq

8

内容来自zvvq

@Configurationpublic class RedissonConfig {

本文来自zvvq

@Bean zvvq

public RedissonClient getRedisson(){ copyright zvvq

Config config = new Config(); 本文来自zvvq

config.useSingleServer().setAddress("redis://localhost:6379"); 内容来自samhan

return Redisson.create(config); 内容来自zvvq,别采集哟

}} zvvq好,好zvvq

7.3 使⽤

zvvq

参考命令匹配列表

zvvq.cn

8 Redis内存淘汰策略 内容来自zvvq,别采集哟

Redis官⽅给的警告,当内存不⾜时,Redis会根据配置的缓存策略淘汰部分的Keys,以保证写⼊成功。当⽆淘汰策略时或者没有找到适合淘汰的Key时,Redis直接返回 out of memory错误。 内容来自samhan

最⼤缓存配置 内容来自zvvq,别采集哟

在Redis中,允许⽤户设置的最⼤使⽤内存⼤⼩ 内容来自samhan666

maxmemory 512G

Redis提供8种(5.0以后)数据淘汰策略:

内容来自samhan666

volatile-lru:从已设置过期时间的数据集中挑选最近最少使⽤的数据淘汰 volatile-lfu:从已设置过期的Keys中,删除⼀段时间内使⽤次数最少使⽤ 的key volatile-ttl:从已设置过期时间的数据集中挑选最近将要过期的数据进⾏淘汰 volatile-random:从已设置过期时间的数据集中随机选择数据淘汰 allkeys-lru:从数据集中挑选最近最少使⽤的数据淘汰 allkeys-lfu:从所有的keys中,删除⼀段时间内使⽤次数最少的key allkeys-random:从数据集中随机选择数据淘汰 no-enviction(驱逐):禁⽌驱逐数据(不采⽤任何淘汰策略。默认即此配置),内存不⾜时,针对写操作,返回错误信息

建议:了解了Redis的淘汰策略之后,在平时使⽤时应尽量主动设置/更新key的expire时间,主动剔除不活跃的旧数据,有助于提升查询性能

zvvq好,好zvvq

以上就是分析Redis的详细内容,更多请关注其它相关文章!

内容来自samhan