Redis
- 1.安装(解压即可)
- 2.启动
- 3.Redis核心配置文件Redis.conf
- 4.Redis持久化总结
- 5.Redis常用数据类型以及应用场景
- 5.0 Redis键(key)
- 5.1 String
- 5.1.1 set、get、del、append(拼接)、strlen(获取字符串的长度)
- 5.1.2 incr、decr(只有数字能+1 和 -1);incrby、decrby(将 key 中储存的数字加指定增量值)
- 5.1.3 range [范围];getrange 获取指定区间范围内的值,类似between...and的关系,从零到负一表示全部
- 5.1.4 setrange 设置指定区间范围内的值,格式是setrange key值 具体值
- 5.1.5 setex(set with expire)键秒值;setnx(不存在的时候再去赋值)
- 5.1.6 Mset 同时设置一个或多个 key-value 对;
- 5.1.6 Mget 返回所有给定 key 的值。如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
- 5.1.6 msetnx 当所有 key 都成功设置,返回 1 。如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。原子操作
- 5.1.7 可以用来缓存对象
- 5.1.8 etset(先get再set)
- 5.2 List
- 5.2.1 Lpush:将一个或多个值插入到列表头部。(左);rpush:将一个或多个值插入到列表尾部。(右);lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
- 5.2.2 lpop 移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil ;rpop 移除列表的最后一个元素,返回值为移除的元素。
- 5.2.3 Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
- 5.2.4 llen 用于返回列表的长度。
- 5.2.5 lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
- 5.2.6 Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
- 5.2.7 rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
- 5.2.8 lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。
- 5.2.9 linsert key before/after pivot value 用于在列表的元素前或者后插入元素;将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
- 5.2.10 性能总结
- 5.2.11 常用
- 5.3 Hash (二维表)
- 5.3.1 hset、hget 命令用于为哈希表中的字段赋值 ; hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段;hgetall 用于返回哈希表中,所有的字段和值;hdel 用于删除哈希表 key 中的一个或多个指定字段
- 5.3.2 hlen 获取哈希表中字段的数量。
- 5.3.3 hexists 查看哈希表的指定字段是否存在。
- 5.3.4 hkeys 获取哈希表中的所有域(field);hvals 返回哈希表所有域(field)的值。
- 5.3.5 hincrby 为哈希表中的字段值加上指定增量值。
- 5.3.6 hincrby 为哈希表中的字段值加上指定增量值。
- 5.3.7 小结
- 5.3.8 常用
- 5.4 Set(无序集合)
- 5.4.1 Set sadd 将一个或多个成员元素加入到集合中,不能重复;smembers 返回集合中的所有的成员;sismember 命令判断成员元素是否是集合的成员。
- 5.4.2 scard,获取集合里面的元素个数
- 5.4.3 srem key value 用于移除集合中的一个或多个成员元素
- 5.4.4 srandmember key 命令用于返回集合中的一个随机元素。
- 5.4.5 spop key 用于移除集合中的指定 key 的一个或多个随机元素
- 5.4.6 smove SOURCE DESTINATION MEMBER(将指定成员 member 元素从 source 集合移动到 destination 集合)
- 5.4.7 -数字集合类(- 差集: sdiff,- 交集: sinter,- 并集: sunion)
- 5.4.8 小结
- 5.4.9 常用
- 5.5 SortSet(有序集合Zset)
- 5.5.1 zadd 将一个或多个成员元素及其分数值加入到有序集当中;zrange 返回有序集中,指定区间内的成员
- 5.5.2 zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
- 5.5.3 zrem 移除有序集中的一个或多个成员
- 5.5.4 zcard 计算集合中元素的数量。
- 5.5.5 zcount计算有序集合中指定分数区间的成员数量
- 5.5.6 zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
- 5.5.7 zrevrank 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。
- 5.5.8 小结
- 5.5.9 常用
- 6.Redis的整合(Jedis) Java for Redis
1.安装(解压即可)
Windows版本只有Redis-x64-3.2.100这个版本:
2.启动
2.1启动Redis服务端
启动命令:
.\redis-server.exe
PID:进程id
redis-server.exe redis.windows.conf
官网地址:
https://redis.io/
中⽂官网:http://redis.cn
官⽅网站下载:http://redis.io/download
2.2启动Redis客户端
进⼊入对应的安装⽬目录,打开命令窗⼝。
执⾏行行命令:
redis-cli
3.Redis核心配置文件Redis.conf
3.1 守护进程(重要)
- Redis 默认不是以守护进程的⽅式运行,可以通过该配置项修改,使⽤用yes启动守护进程
daemonize no
3.2监听端⼝(重要)
- 指定Redis监听端⼝口,默认端口为6379,作者在⼀片博⽂文中解释了为什么选⽤用6379作为默认端口,因为6379在⼿机按键上MERZ对应的号码,而MERZ取自意大利利歌手Alessia Merz的名字
port 6379
3.3绑定的主机地址(重要)
bind 127.0.0.1
3.4 RDB 持久化策略(重要)
RDB 持久化策略,指定在多⻓时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <.seconds> <.changes>
Redis默认配置⽂文件提供了三个条件
save 900 1
save 300 10
save 60 10000
3.5 压缩数据(重要)
指定存储⾄至本地数据库时是否压缩数据,默认为yes,Redis采⽤用LZF(压缩算法)压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库⽂件变得巨大.
rdbcompression yes
3.6 Redis连接密码(重要)
设置Redis连接密码,如果配置了连接密码,客户端在连接Redis的时候需要通过 AUTH
<.password> 命令提供密码,默认关闭
requirepass foobared
3.7 AOF 持久化策略配置(重要)
3.7.1 日志记录
指定是否在每次操作后进行日志记录,Redis在默认情况下是关闭的
appendonly no
3.7.2 AOF文件的名字
appendfilename “appendonly.aof”
3.7.3 AOF三种策略
aof策略略,分为三种,always表示每次操作都会记录日志,everysec表示每秒记录一次日志,no表
示不记录日志
.# appendfsync always
appendfsync everysec
.# appendfsync no
3.8 定时关闭连接
当客户端闲置多长时间后关闭连接(单位是秒)
timeout 300
3.9 日志记录级别
指定日志记录级别,Redis共支持四个级别:debug、verbose、notice、warning
loglevel verbose
3.10 数据库数量
数据库数量(单机环境下),默认数据库为0,可以使用select 命令在连接上指定数据库id
databases 16
3.11持久化文件名
dbfilename dump.rdb
4.Redis持久化总结
4.1 RDB
- RDB:是Redis默认的持久化机制。RDB相当于照快照,保存的是一种状态。几十GB的数据 ------> 几KB
的快照 - 快照是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文
件名为dump.rdb。 - 优点:快照保存数据极快、还原数据极快。适用于容灾备份
- 缺点:小内存机器器不适合使用,RDB机制符合要求就会照快照,可能会丢失数据
- 快照条件:
1、服务器器正常关闭时 ./bin/redis-cli shutdown
2、key满⾜足⼀一定条件,会进⾏行行快照
4.1.1 RDB持久化操作
1.修改持久化策略
2.修改文件名
3.修改存储路径
4.重启Redis服务器并重新读取配置文件
redis-server.exe redis.windows.conf
5.重启Redis客户端
redis-cli
6.在客户端在写入数据
7.再次重启客户端后,同样可以拿到数据
4.2 AOF
- 由于快照方式是在⼀定时间间隔内做一次的,那么如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应⽤用要求不能丢失任何修改的话,可以采取aof持久化方式。
- Append-only file:aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。
- 当redis重启时会通过执行文件中保存的写命令来在内存中重建整个数据库的内容。
- 有三种方式如下:(默认是每秒一次)
- appendonly yes 启用aof持久化方式
- appendsync always 收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
- appendsync 每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
- appendsync no 完全依赖os,性能最好,持久化没有保证
4.2.1 AOF持久化操作
5.Redis常用数据类型以及应用场景
Redis⽀支持五种数据类型:String(字符串串),hash(哈希),list(列列表),set(集合)以及zset(sorted set:有序集合) 等
Redis 在线命令参考查询:
http://doc.redisfans.com/index.html
5.0 Redis键(key)
5.0.1 keys * 查看所有的key
5.0.2 exists key 的名字,判断某个key是否存在
5.0.3 move key db —> 当前库就没有了,被移除了
5.0.4 expire key 秒钟:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
5.0.5 ype key 查看你的key是什么类型
5.1 String
- string是Redis最基本的类型,一个key对应一个value,一个键最大能存储512MB。
- string类型是二进制安全的。意思是Redis的string可以包含任何数据。⽐比如jpg图片或者序列化对象。
- 二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果有被攻击,能够及时检测出来
- 跟之前的map 非常类似。Value是字符串。
5.1.1 set、get、del、append(拼接)、strlen(获取字符串的长度)
- SET: key value
- GET: key
- 删除key(del key1)
- 对不存在的 key 进行 APPEND ,等同于 SET
key1 “hello”
127.0.0.1:6379> append key1 "hello" # 对不存在的 key 进行 APPEND ,等同于 SET
key1 "hello"
(integer) 5 # 字符长度
127.0.0.1:6379> APPEND key1 "-2333" # 对已存在的字符串进行 APPEND
(integer) 10 # 长度从 5 个字符增加到 10 个字符
127.0.0.1:6379> get key1
"hello-2333"
127.0.0.1:6379> STRLEN key1 # # 获取字符串的长度
(integer) 10
5.1.2 incr、decr(只有数字能+1 和 -1);incrby、decrby(将 key 中储存的数字加指定增量值)
127.0.0.1:6379> set views 0 # 设置浏览量为0
OK
127.0.0.1:6379> incr views # 浏览 + 1
(integer) 1
127.0.0.1:6379> incr views # 浏览 + 1
(integer) 2
127.0.0.1:6379> decr views # 浏览 - 1
(integer) 1
127.0.0.1:6379> incrby views 10 # +10
(integer) 11
127.0.0.1:6379> decrby views 10 # -10
(integer) 1
5.1.3 range [范围];getrange 获取指定区间范围内的值,类似between…and的关系,从零到负一表示全部
127.0.0.1:6379> set key2 abcd123456 # 设置key2的值
OK
127.0.0.1:6379> getrange key2 0 -1 # 获得全部的值
"abcd123456"
127.0.0.1:6379> getrange key2 0 2 # 截取部分字符串
"abc"
5.1.4 setrange 设置指定区间范围内的值,格式是setrange key值 具体值
127.0.0.1:6379> get key2
"abcd123456"
127.0.0.1:6379> SETRANGE key2 1 xx # 替换值
(integer) 10
127.0.0.1:6379> get key2
"axxd123456"
5.1.5 setex(set with expire)键秒值;setnx(不存在的时候再去赋值)
127.0.0.1:6379> setex key3 60 expire # 设置过期时间
OK
127.0.0.1:6379> ttl key3 # 查看剩余的时间
(integer) 55
127.0.0.1:6379> setnx mykey "redis" # 如果不存在就设置,成功返回1
(integer) 1
127.0.0.1:6379> setnx mykey "mongodb" # 如果存在就设置,失败返回0
(integer) 0
127.0.0.1:6379> get mykey
"redis"
5.1.6 Mset 同时设置一个或多个 key-value 对;
5.1.6 Mget 返回所有给定 key 的值。如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
5.1.6 msetnx 当所有 key 都成功设置,返回 1 。如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。原子操作
127.0.0.1:6379> mset k10 v10 k11 v11 k12 v12
OK
127.0.0.1:6379> keys *
1) "k12"
2) "k11"
3) "k10"
127.0.0.1:6379> mget k10 k11 k12 k13
1) "v10"
2) "v11"
3) "v12"
4) (nil)
127.0.0.1:6379> msetnx k10 v10 k15 v15 # 原子性操作!
(integer) 0
127.0.0.1:6379> get key15
(nil)
5.1.7 可以用来缓存对象
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
127.0.0.1:6379> mset user:a:name lisi
OK
127.0.0.1:6379> mget user:a:name
1) "lisi"
127.0.0.1:6379> mset student:stu:name zhaoliu student:stu:age 18
OK
127.0.0.1:6379> mget student:stu:name student:stu:age
1) "zhaoliu"
2) "18"
5.1.8 etset(先get再set)
127.0.0.1:6379> getset db mongodb # 没有旧值,返回 nil
(nil)
127.0.0.1:6379> get db
"mongodb"
127.0.0.1:6379> getset db redis # 返回旧值 mongodb
"mongodb"
127.0.0.1:6379> get db
"redis"
应⽤用场景:很常见的场景用于统计网站访问数量量 pv(Page view),当前在线人数,微博数,粉丝数等。incr命令(++操作)
5.2 List
- Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构。
- 所以向列表两端添加元素的时间复杂度为o(1),获取越接近两端的元素速度就越快。
- 这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295。
5.2.1 Lpush:将一个或多个值插入到列表头部。(左);rpush:将一个或多个值插入到列表尾部。(右);lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
- 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
- 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
127.0.0.1:6379> LPUSH list "one"
(integer) 1
127.0.0.1:6379> LPUSH list "two"
(integer) 2
127.0.0.1:6379> RPUSH list "right"
(integer) 3
127.0.0.1:6379> Lrange list 0 -1
1) "two"
2) "one"
3) "right"
127.0.0.1:6379> Lrange list 0 1
1) "two"
2) "one"
5.2.2 lpop 移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil ;rpop 移除列表的最后一个元素,返回值为移除的元素。
127.0.0.1:6379> Lpop list
"two"
127.0.0.1:6379> Rpop list
"right"
127.0.0.1:6379> Lrange list 0 -1
1) "one"
5.2.3 Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
127.0.0.1:6379> Lindex list 1
(nil)
127.0.0.1:6379> Lindex list 0
"one"
127.0.0.1:6379> Lindex list -1
"one"
5.2.4 llen 用于返回列表的长度。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> Lpush list "one"
(integer) 1
127.0.0.1:6379> Lpush list "two"
(integer) 2
127.0.0.1:6379> Lpush list "three"
(integer) 3
127.0.0.1:6379> Llen list # 返回列表的长度
(integer) 3
5.2.5 lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
127.0.0.1:6379> lrem list 1 "two"
(integer) 1
127.0.0.1:6379> Lrange list 0 -1
1) "three"
2) "one"
5.2.6 Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
127.0.0.1:6379> RPUSH mylist "hello2"
(integer) 3
127.0.0.1:6379> RPUSH mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello2"
5.2.7 rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "foo"
(integer) 2
127.0.0.1:6379> rpush mylist "bar"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist
"bar"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "foo"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "bar"
5.2.8 lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。
127.0.0.1:6379> exists list # 对空列表(key 不存在)进行 LSET
(integer) 0
127.0.0.1:6379> lset list 0 item # 报错
(error) ERR no such key
127.0.0.1:6379> lpush list "value1" # 对非空列表进行 LSET
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 "new" # 更新值
OK
127.0.0.1:6379> lrange list 0 0
1) "new"
127.0.0.1:6379> lset list 1 "new" # index 超出范围报错
(error) ERR index out of range
5.2.9 linsert key before/after pivot value 用于在列表的元素前或者后插入元素;将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
5.2.10 性能总结
(1)它是一个字符串链表,left,right 都可以插入添加
(2)如果键不存在,创建新的链表
(3)如果键已存在,新增内容
(4)如果值全移除,对应的键也就消失了
(5)链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
注意:
(1)list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。
(2)Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部添加或者删除元素,这样List即可以作为栈,也可以作为队列。
5.2.11 常用
- LPUSH :后面的元素放在栈顶
- LPOP :返回第一个元素,并且在列表上删除该元素 (栈顶)
- LLEN :返回当前的list列表的长度
- LINDEX: 返回当前的list的指定index下标的元素。没有返回nil,0表示栈顶的元素
- LINSERT :插入的位置是按照index的顺序,Before的话得注意 index的值
- LPUSHX :如果list存在,再去push
- LRANGE :可以方便的查看某个index范围内的list的值。输入的index是从0开始,显示的标号是从1开始的。
- LREM :删除list里的指定的前几个(指定value的)元素
删除指定位置的元素:没有 - LSET :设置指定的位置的元素的值 (修改) 输入的index是从0开始,显示的标号是从1开始的。
应⽤用场景:1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进⾏行执行。(消费者)
5.3 Hash (二维表)
kv模式不变,但V是一个键值对
Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。
5.3.1 hset、hget 命令用于为哈希表中的字段赋值 ; hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段;hgetall 用于返回哈希表中,所有的字段和值;hdel 用于删除哈希表 key 中的一个或多个指定字段
127.0.0.1:6379> hset myhash field1 "kuangshen"
(integer) 1
127.0.0.1:6379> hget myhash field1
"kuangshen"
127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
127.0.0.1:6379> HGET myhash field1
"Hello"
127.0.0.1:6379> HGET myhash field2
"World"
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
127.0.0.1:6379> HDEL myhash field1
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "World"
5.3.2 hlen 获取哈希表中字段的数量。
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World"
OK
127.0.0.1:6379> hlen myhash
(integer) 2
5.3.3 hexists 查看哈希表的指定字段是否存在。
127.0.0.1:6379> hexists myhash field1
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
5.3.4 hkeys 获取哈希表中的所有域(field);hvals 返回哈希表所有域(field)的值。
127.0.0.1:6379> HKEYS myhash
1) "field2"
2) "field1"
127.0.0.1:6379> HVALS myhash
1) "World"
2) "Hello"
5.3.5 hincrby 为哈希表中的字段值加上指定增量值。
127.0.0.1:6379> hset myhash field 5
(integer) 1
127.0.0.1:6379> HINCRBY myhash field 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field -1
(integer) 5
127.0.0.1:6379> HINCRBY myhash field -10
(integer) -5
5.3.6 hincrby 为哈希表中的字段值加上指定增量值。
127.0.0.1:6379> HSETNX myhash field1 "hello"
(integer) 1 # 设置成功,返回 1 。
127.0.0.1:6379> HSETNX myhash field1 "world"
(integer) 0 # 如果给定字段已经存在,返回 0 。
127.0.0.1:6379> HGET myhash field1
"hello"
5.3.7 小结
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
存储部分变更的数据,如用户信息等。
5.3.8 常用
- HSET【hset】(HSET key field value):
将哈希表 key 中的域 field 的值设为 value ;
如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作;
如果域 field 已经存在于哈希表中,旧值将被覆盖。 - HGET :返回哈希表 key 中给定域 field 的值。如果不存在,返回nil
- HEXISTS(HEXISTS key field):查看哈希表 key 中,给定域 field 是否存在。
- HGETALL(HGETALL key):
返回哈希表 key 中,所有的域和值;
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表⼤小的两倍。 - HKEYS(HKEYS key):返回哈希表 key 中的所有值。
- HLEN:返回哈希表 key 中值的数量。
- HVALS(HVALS key):返回哈希表 key 中所有域的值。
- HINCRBY(HINCRBY key field increment):
为哈希表 key 中的域 field 的值加上增量 increment ;
增量也可以为负数,相当于对给定域进行减法操作;
如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令;
如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 ;
对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误;
本操作的值被限制在 64 位(bit)有符号数字表示之内。 - HMGET(HMGET key field [field …])
返回哈希表 key 中,一个或多个给定域的值;
如果给定的域不存在于哈希表,那么返回一个 nil 值;
因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行HMGET 操作将返回一个只带有 nil 值的表。 - HMSET(HMSET key field value [field value …])
同时将多个 field-value (域-值)对设置到哈希表 key 中;
此命令会覆盖哈希表中已存在的域;
如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。 - HSETNX(HSETNX key field value)
将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在;
若域 field 已经存在,该操作无效;
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令。
应用场景:例如存储、读取、修改用户属性(name,age,pwd等)
5.4 Set(无序集合)
5.4.1 Set sadd 将一个或多个成员元素加入到集合中,不能重复;smembers 返回集合中的所有的成员;sismember 命令判断成员元素是否是集合的成员。
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "hello"
127.0.0.1:6379> SISMEMBER myset "hello"
(integer) 1
127.0.0.1:6379> SISMEMBER myset "world"
(integer) 0
5.4.2 scard,获取集合里面的元素个数
127.0.0.1:6379> scard myset
(integer) 2
5.4.3 srem key value 用于移除集合中的一个或多个成员元素
127.0.0.1:6379> srem myset "kuangshen"
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "hello"
5.4.4 srandmember key 命令用于返回集合中的一个随机元素。
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "world"
3) "hello"
127.0.0.1:6379> SRANDMEMBER myset
"hello"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "world"
2) "kuangshen"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "kuangshen"
2) "hello"
5.4.5 spop key 用于移除集合中的指定 key 的一个或多个随机元素
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "world"
3) "hello"
127.0.0.1:6379> spop myset
"world"
127.0.0.1:6379> spop myset
"kuangshen"
127.0.0.1:6379> spop myset
"hello"
5.4.6 smove SOURCE DESTINATION MEMBER(将指定成员 member 元素从 source 集合移动到 destination 集合)
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "kuangshen"
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "world"
2) "hello"
127.0.0.1:6379> SMEMBERS myset2
1) "kuangshen"
2) "set2"
5.4.7 -数字集合类(- 差集: sdiff,- 交集: sinter,- 并集: sunion)
127.0.0.1:6379> sadd key1 "a"
(integer) 1
127.0.0.1:6379> sadd key1 "b"
(integer) 1
127.0.0.1:6379> sadd key1 "c"
(integer) 1
127.0.0.1:6379> sadd key2 "c"
(integer) 1
127.0.0.1:6379> sadd key2 "d"
(integer) 1
127.0.0.1:6379> sadd key2 "e"
(integer) 1
127.0.0.1:6379> SDIFF key1 key2 # 差集
1) "a"
2) "b"
127.0.0.1:6379> sdiff key2 key1
1) "e"
2) "d"
127.0.0.1:6379> SINTER key1 key2 # 交集
1) "c"
127.0.0.1:6379> SUNION key1 key2 # 并集
1) "a"
2) "b"
3) "c"
4) "e"
5) "d"
5.4.8 小结
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
5.4.9 常用
- SADD(SADD key member [member …])
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略;
假如 key 不存在,则创建一个只包含 member 元素作成员的集合;
当 key 不是集合类型时,返回一个错误。 - SMEMBERS(SMEMBERS key)
返回集合 key 中的所有成员;
不存在的 key 被视为空集合。 - SISMEMBER(SISMEMBER key member)
判断 member 元素是否集合 key 的成员。 - SCARD(SCARD key)
返回集合 key 的基数(集合中元素的数量)。 - SPOP (弹出并从集合删除)(SPOP key)
移除并返回集合中的一个随机元素;
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。 - SRANDMEMBER(SRANDMEMBER key [count])
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素;
随机取出 count个元素(不删除) - SINTER(SINTER key [key …])
返回一个集合的全部成员,该集合是所有给定集合的交集;
不存在的 key 被视为空集。 - SINTERSTORE(SINTERSTORE destination key [key …])
这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集;
如果 destination 集合已经存在,则将其覆盖。 - SUNION(SUNION key [key …])
返回一个集合的全部成员,该集合是所有给定集合的并集;
不存在的 key 被视为空集。 - SUNIONSTORE(SUNIONSTORE destination key [key …])
这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,⽽不是简单地返回结果集;
如果 destination 已经存在,则将其覆盖。 - SDIFF(SDIFF key [key …])
返回一个集合的全部成员,该集合是所有给定集合之间的差集;
不存在的 key 被视为空集。 - SDIFFSTORE(SDIFFSTORE destination key [key …])
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,⽽不是简单地返回结果集;
如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。 - SMOVE(SMOVE source destination member)
将 member 元素从 source 集合移动到 destination 集合。SMOVE 是原子性操作。 - SREM 删除(SREM key member [member …])
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略略;
当 key 不是集合类型,返回一个错误。
应用场景:
1.利用交集求共同好友。
2.利用唯一性,可以统计访问网站的所有独立IP。
3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。
5.5 SortSet(有序集合Zset)
在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2
5.5.1 zadd 将一个或多个成员元素及其分数值加入到有序集当中;zrange 返回有序集中,指定区间内的成员
127.0.0.1:6379> zadd myset 1 "one"
(integer) 1
127.0.0.1:6379> zadd myset 2 "two" 3 "three"
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
5.5.2 zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
127.0.0.1:6379> zadd salary 2500 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 5000 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 500 kuangshen
(integer) 1
# Inf无穷大量+∞,同样地,-∞可以表示为-Inf。
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 显示整个有序集
1) "kuangshen"
2) "xiaoming"
3) "xiaohong"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 递增排列
1) "kuangshen"
2) "500"
3) "xiaoming"
4) "2500"
5) "xiaohong"
6) "5000"
127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES # 递减排列
1) "xiaohong"
2) "5000"
3) "xiaoming"
4) "2500"
5) "kuangshen"
6) "500"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 WITHSCORES # 显示工资 <=2500
的所有成员
1) "kuangshen"
2) "500"
3) "xiaoming"
4) "2500"
5.5.3 zrem 移除有序集中的一个或多个成员
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "xiaoming"
3) "xiaohong"
127.0.0.1:6379> zrem salary kuangshen
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "xiaoming"
2) "xiaohong"
5.5.4 zcard 计算集合中元素的数量。
127.0.0.1:6379> zcard salary
(integer) 2
5.5.5 zcount计算有序集合中指定分数区间的成员数量
127.0.0.1:6379> zadd myset 1 "hello"
(integer) 1
127.0.0.1:6379> zadd myset 2 "world" 3 "kuangshen"
(integer) 2
127.0.0.1:6379> ZCOUNT myset 1 3
(integer) 3
127.0.0.1:6379> ZCOUNT myset 1 2
(integer) 2
5.5.6 zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
127.0.0.1:6379> zadd salary 2500 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 5000 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 500 kuangshen
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 显示所有成员及其 score 值
1) "kuangshen"
2) "500"
3) "xiaoming"
4) "2500"
5) "xiaohong"
6) "5000"
127.0.0.1:6379> zrank salary kuangshen # 显示 kuangshen 的薪水排名,最少
(integer) 0
127.0.0.1:6379> zrank salary xiaohong # 显示 xiaohong 的薪水排名,第三
(integer) 2
5.5.7 zrevrank 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。
127.0.0.1:6379> ZREVRANK salary kuangshen
(integer) 2
127.0.0.1:6379> ZREVRANK salary xiaohong
(integer) 0
5.5.8 小结
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
排行榜应用,取TOP N操作 !
5.5.9 常用
- ZADD(ZADD key score member [[score member] [score member] …]):
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 - ZCARD(ZCARD key):
返回有序集 key 的基数。 - ZSCORE(ZSCORE key member):
返回有序集 key 中,成员 member 的 score 值;
如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 - ZCOUNT (闭区间)(ZCOUNT key min max)
返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量;
关于参数 min 和 max 的详细使⽤方法,请参考 ZRANGEBYSCORE 命令。 - ZINCRBY(ZINCRBY key increment member):
为有序集 key 的成员 member 的 score 值加上增量 increment 。 - ZRANGE(ZRANGE key start stop [WITHSCORES]):
返回有序集 key 中,指定区间内的成员,
其中成员的位置按 score 值递增(从小到大)来排序;
具有相同 score 值的成员按字典序(lexicographical order )来排列。 - ZRANGEBYSCORE(ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]):
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列;
根据指定的分值范围去查找。 - ZRANK (排名从0开始)(ZRANK key member):
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从⼩到⼤)顺序排列。 - ZREVRANGE(ZREVRANGE key start stop [WITHSCORES])
返回有序集 key 中,指定区间内的成员;
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。 - ZREVRANGEBYSCORE(ZREVRANGE key start stop [WITHSCORES]):
返回有序集 key 中,指定区间内的成员。 - ZREVRANK(ZREVRANK key member)
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从⼤到小)排序;
排名以 0 为底,也就是说, score 值最⼤大的成员排名为 0 ;
使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。 - ZREM(ZREM key member [member …])
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
当 key 存在但不是有序集类型时,返回一个错误。 - ZREMRANGEBYRANK(ZREMRANGEBYRANK key start stop)
移除有序集 key 中,指定排名(rank)区间内的所有成员;
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。 - ZREMRANGEBYSCORE(ZREMRANGEBYSCORE key min max)
移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
应⽤用场景:可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发⽣生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取积分top ten的⽤用户信息。
6.Redis的整合(Jedis) Java for Redis
6.1结构
6.2导包(配置pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cskaoyan</groupId>
<artifactId>jedis-demo</artifactId>
<version>28.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
6.3写出连接工具类(用Java代码与redis服务器之间建立连接)
用Java代码与redis服务器之间建立连接
JedisUtils.java
public class JedisUtils {
static Jedis jedis;
static {
jedis = new Jedis("localhost",6379);
}
public static Jedis getJedis(){
return jedis;
}
}
6.4Jedis测试类
public class JedisTest {
Jedis jedis;
@Before
public void init(){
jedis = JedisUtils.getJedis();
}
// Set
@Test
public void test01(){
jedis.set("name1","悟空");
}
// Get
@Test
public void test02(){
String name = jedis.get("name");
System.out.println(name);
}
// lpush
@Test
public void testLpush(){
jedis.lpush("mylist","1","2","3","4","5");
}
@Test
public void testLrange(){
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
}
}
结果:
set,get
testLpush(),testLrange()
其它操作和命令行是一样的,前面Redis命令行操作很详细,同理可得。