作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)
1.redis的数据结构
redis数据库不像mysql关系型数据库,使用表来存放数据,redis是使用key-value的形式来存放数据的,支持的数据类型有:String,list,set,zset,hash。
2.String类型的相关命令
字符串类型 是 Redis 最基础的数据结构。字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON、XML)、数字(整数、浮点数),甚至是 二进制(图片、音频、视频),但是值最大不能超过 512MB。
命令 | 解释 |
---|---|
set | 存放值 |
get | 获取值 |
mset | 存放多个值 |
mget | 获取多个值 |
append | 追加到现有的值后面 |
incr | 使值递增1 |
incrby | 使值递增指定数字 |
incebyfloat | 使值递增指定数字,浮点型 |
decr | 使值递减1 |
decrby | 使值递减指定数字 |
getrange | 获取从起始下标到结束下标之间的值 |
setNX | 当key不存在时保存,存在则什么也不做 |
示例:
1.set key value [ex seconds] [px milliseconds] [nx|xx]
set 命令有几个选项:
ex seconds:为 键 设置 秒级过期时间。
px milliseconds:为 键 设置 毫秒级过期时间。
nx:键必须 不存在,才可以设置成功,用于 添加。
xx:与 nx 相反,键必须 存在,才可以设置成功,用于 更新。
//set key value PX|EX 过期时间(PX后面跟的是毫秒,EX是秒)
127.0.0.1:6379> set name jack EX 100
OK
2.get
127.0.0.1:6379> get name
"jack"
3.mset
//一次存放两个key
127.0.0.1:6379> mset age 18 tall 1.87
OK
4.mget
//一次获取两个key
127.0.0.1:6379> mget age tall
1) "18"
2) "1.87"
5.append
//在刚才设置的name后面追加chen
127.0.0.1:6379> append name chen
(integer) 8
127.0.0.1:6379> get name
"jackchen"
127.0.0.1:6379>
6.incr、incrby、incebyfloat
incr 命令用于对值做 自增操作,返回结果分为三种情况:
值不是 整数,返回 错误。
值是 整数,返回 自增 后的结果。
键不存在,按照值为 0 自增,返回结果为 1。
127.0.0.1:6379> set i 1
OK
127.0.0.1:6379> incr i
(integer) 2
127.0.0.1:6379> get i
"2"
127.0.0.1:6379> incrby i 5
(integer) 7
127.0.0.1:6379> get i
"7"
127.0.0.1:6379> incrbyfloat i 1.1
"8.1"
127.0.0.1:6379> get i
"8.1"
127.0.0.1:6379>
7.decr、decrby
127.0.0.1:6379> set j 9
OK
127.0.0.1:6379> decr j
(integer) 8
127.0.0.1:6379> get j
"8"
127.0.0.1:6379> decrby j 6
(integer) 2
8.getrange
127.0.0.1:6379> set test hello
OK
127.0.0.1:6379> getrange test 0 3
"hell"
127.0.0.1:6379>
9.setNX
//先设置一个nx的key
127.0.0.1:6379> set nx nx
OK
127.0.0.1:6379> setnx nx nx
//使用setnx再次设置key为nx的,发现没有设置成功,因为已经存在key为nx的值了
(integer) 0
127.0.0.1:6379> setnx hh hh
//设置key为hh的,成功了
(integer) 1
127.0.0.1:6379>
3.列表(list)有序不去重
列表(list)类型是用来存储多个 有序 的 字符串。在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表、获取 指定索引下标 的 元素 等。列表 是一种比较 灵活 的 数据结构,它可以充当 栈 和 队列 的角色,在实际开发上有很多应用场景。
命令 | 解释 |
---|---|
lpush | 在列表头部添加一个或多个值 |
rpush | 在列表尾部添加一个或多个值 |
lpop | 移除头部一个值 |
rpop | 移除尾部一个值 |
lrange | 获取起始位置到结束位置之间的值 |
lindex | 获取指定下标的值 |
llen | 获取列表的长度 |
ltrim | 截取列表 |
brpop | 阻塞的取元素 |
使用场景
命令 | 场景 |
---|---|
lpush + lpop | Stack(栈) |
lpush + rpop | Queue(队列) |
lpush + brpop | Message Queue(消息队列) |
示例:
1.lpush
127.0.0.1:6379> lpush mylist hello bye good
(integer) 3
2.lrange
//获取列表中的所有元素
127.0.0.1:6379> lrange mylist 0 -1
1) "good"
2) "bye"
3) "hello"
3.rpush
127.0.0.1:6379> rpush mylist yes
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "good"
2) "bye"
3) "hello"
4) "yes"
4.lpop
127.0.0.1:6379> lpop mylist
"good"
127.0.0.1:6379> lrange mylist 0 -1
1) "bye"
2) "hello"
3) "yes"
5.rpop
127.0.0.1:6379> rpop mylist
"yes"
127.0.0.1:6379> lrange mylist 0 -1
1) "bye"
2) "hello"
6.lindex
127.0.0.1:6379> lindex mylist 0
"bye"
7.llen
127.0.0.1:6379> llen mylist
(integer) 2
8.brpop key timeout
timeout为0表示一直挂起,直到集合中有元素了取到返回,多个客户端从列表中阻塞取元素时,先连接的等有元素了会先取到
//新建一个列表,往列表里添加两个元素
127.0.0.1:6379> lpush listtest aaa bbb
(integer) 2
127.0.0.1:6379> lrange listtest 0 -1
1) "bbb"
2) "aaa"
//开启另一个客户端,阻塞的取
127.0.0.1:6379> brpop listtest 0
1) "listtest"
2) "aaa"
//再取一次,这时候列表为空了
127.0.0.1:6379> brpop listtest 0
1) "listtest"
2) "bbb"
//当列表为空,再次取的时候,就会一直挂起
127.0.0.1:6379> brpop listtest 0
//再打开一个客户端,也阻塞的取元素
127.0.0.1:6379> brpop listtest 0
//然后往列表里添加,这时第一个阻塞的客户端会获取元素
127.0.0.1:6379> lpush listtest jiji
(integer) 1
127.0.0.1:6379> brpop listtest 0
1) "listtest"
2) "jiji"
(107.15s)这里会有一个等待的时间
4.set
集合(set)类型也是用来保存多个 字符串元素,但和 列表类型 不一样的是,集合中 不允许有重复元素,并且集合中的元素是 无序的,不能通过 索引下标 获取元素。
命令 | 解释 |
---|---|
sadd | 添加一个或多个值 |
srem | 移除一个或多个值 |
scard | 获取集合的长度 |
sismember | 查看集合中是否包含某个值 |
smembers | 获取所有元素 |
sinter | 取多个集合的交集 |
suinon | 取多个集合的并集 |
sdiff | 取多个集合的差集 |
1.sadd
127.0.0.1:6379> sadd set1 aa bb cc
(integer) 3
127.0.0.1:6379> smembers set1
1) "aa"
2) "cc"
3) "bb"
2.srem
127.0.0.1:6379> srem set1 aa
(integer) 1
127.0.0.1:6379> smembers set1
1) "cc"
2) "bb"
3.scard
127.0.0.1:6379> scard set1
(integer) 2
4.sismember
127.0.0.1:6379> sismember set1 hh
(integer) 0
127.0.0.1:6379> sismember set1 cc
(integer) 1
5.sinter
127.0.0.1:6379> sadd set1 aa bb cc
(integer) 1
127.0.0.1:6379> sadd set2 bb hh nn
(integer) 3
(integer) 3
127.0.0.1:6379> sinter set1 set2
1) "bb"
6.sunion
127.0.0.1:6379> sunion set1 set2
1) "aa"
2) "bb"
3) "cc"
4) "nn"
5) "hh"
7.sinterstore将交集存储到redis中
127.0.0.1:6379> sinterstore inter set1 set2
(integer) 1
127.0.0.1:6379> smembers inter
1) "bb"
5.sorted set 有序去重
1.sorted set也被叫做zset,因为命令都是以z开头,与set的结构基本是一样的,命令也是类似的。
2.zset是有序的,每个元素都要设置权重值,权重值是可以重复的,但元素是不重复的。
命令 | 解释 |
---|---|
zadd | 添加一个或多个值 |
zrem | 移除一个或多个值 |
zcard | 获取集合的长度 |
zrange | 获取起始位置到结束位置之间的元素 |
1.zadd
//这里添加了两个bb,之前说过zset是去重的,实际上只会存在一个bb,第二次只是更新了权重值
127.0.0.1:6379> zadd myset 1 aa 2 bb 3 bb 4 cc
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "aa"
2) "bb"
3) "cc"
2.zrem
127.0.0.1:6379> zrem myset aa
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "bb"
2) "cc"
3.zcard
127.0.0.1:6379> zcard myset
(integer) 2