概述:
- redis是key-value的数据结构,每条数据都是⼀个键值对
- 键的类型是字符串
-
注意:键不能重复
-
值得类型有五种:string(字符串),list(列表),hash(字典),set(集合),zset(有序的集合)
数据操作
- 保存
- 修改
- 获取
- 删除
命令文章链接:http://redis.cn/commands.html
string(字符串)
字符串类型是Redis中最为基础的数据存储类型,内部表示是一个字符数组
它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。
在Redis中字符串类型的Value最多可以容纳的数据长度是512M
保存/获取
如果设置的键不存在则为添加,如果设置的键已经存在则修改
set key value 设置
get key 获取
127.0.0.1:6379> set hometown leshan
OK
127.0.0.1:6379> get hometown
"leshan"
127.0.0.1:6379> set hometown chengdu
OK
127.0.0.1:6379> get hometown
"chengdu"
127.0.0.1:6379>
批量键值对
mset key1 value1 key2 value2 .... 设置
mget key1 key2 ..... 获取
127.0.0.1:6379> set name1 onion
OK
127.0.0.1:6379> set name2 tom
OK
127.0.0.1:6379> mget name1
1) "onion"
127.0.0.1:6379> mget name1 name2
1) "onion"
2) "tom"
127.0.0.1:6379> mget name1 name2 name3
1) "onion"
2) "tom"
3) (nil)
127.0.0.1:6379>
127.0.0.1:6379> mset name1 qqq name2 wwww name3 eeee
OK
127.0.0.1:6379> mget name1 name2 name3
1) "qqq"
2) "wwww"
3) "eeee"
127.0.0.1:6379>
设置过期时间
setex key seconds value
127.0.0.1:6379> setex name 5 tina
OK
127.0.0.1:6379> get name
"tina"
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
键命令
查找键、判断键是否存在
键查找 keys <pattern>
判断键是否存在 exist <key>
判断键的类型 type <key>
删除键 del [key...]
查看生存时间 ttl <key>
#匹配所有的键
127.0.0.1:6379> KEYS *
1) "name2"
2) "hometown"
3) "name1"
4) "name3"
#匹配n开头的键
127.0.0.1:6379> keys n*
1) "name2"
2) "name1"
3) "name3"
#判断键是否存在
127.0.0.1:6379> EXISTS hometown
(integer) 1
127.0.0.1:6379> EXISTS home
(integer) 0
127.0.0.1:6379>
判断键的类型
127.0.0.1:6379> type name
none
127.0.0.1:6379> type name1
string
127.0.0.1:6379>
#ttl 生存时间
127.0.0.1:6379> setex name 20 tina
OK
127.0.0.1:6379>
127.0.0.1:6379> ttl name
(integer) 16
127.0.0.1:6379> ttl name
(integer) 15
127.0.0.1:6379> ttl name
(integer) 14
127.0.0.1:6379> ttl name
hash类型
- hash⽤于存储对象,对象的结构为属性、值
- 值的类型为string
设置单个属性 hset key field value
设置多个属性 hmset key field1 value1 field2 value2 ...
获取所有的key hkeys key
获取⼀个属性的值 hget key field
获取多个属性的值 hmget key field1 field2 ...
获取所有属性的值 hvals key
删除
- 删除整个hash键及值,使⽤del命令
删除属性,属性对应的值会被⼀起删除
hdel key field1 field2 ...
#设置单个
127.0.0.1:6379> hset books java "think in java"
(integer) 1
#设置多个
127.0.0.1:6379> HMSET user name onion age 20 hometown "leshan"
OK
#获取所有的key
127.0.0.1:6379> HKEYS user
1) "name"
2) "age"
3) "hometown"
#获取属性的值
127.0.0.1:6379> hget user age
"20"
127.0.0.1:6379> hmget user age hometown
1) "20"
2) "leshan"
127.0.0.1:6379>
#获取所有的属性的值
127.0.0.1:6379> HVALS user
1) "onion"
2) "20"
3) "leshan"
#删除
127.0.0.1:6379> hdel user name age
(integer) 2
127.0.0.1:6379> HVALS user
1) "leshan"
127.0.0.1:6379>
127.0.0.1:6379> del user
(integer) 1
127.0.0.1:6379> HVALS user
(empty list or set)
list类型
- 列表的元素类型为string
- 按照插⼊顺序排序
- 注意它是链表不是数组,意味着插入和删除非常快,时间复杂度O(1),但是查询慢O(n)
- redis 列表结构常用于做异步队列使用,将需要延后处理的任务结构体序列化成字符串,塞进列表,另一个线程从这个列表中轮询数据进行处理
在左侧插⼊数据 lpush key value1 value2 ...
在右侧插⼊数据 rpush key value1 value2 ...
在指定元素的前或后插⼊新元素 linsert key before或after 现有元素 新元素
获取
返回列表⾥指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange key start stop
设置指定索引位置的元素值
- 索引从左侧开始,第⼀个元素为0
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
lset key index value
删除
删除指定元素
- 将列表中前count次出现的值为value的元素移除
- count > 0: 从头往尾移除
- count < 0: 从尾往头移除
- count = 0: 移除所有
lrem key count value
#右进左出:队列
127.0.0.1:6379> RPUSH num 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LLEN num
(integer) 5
127.0.0.1:6379> LPOP num
"1"
127.0.0.1:6379> LPOP num
"2"
127.0.0.1:6379> LPOP num
"3"
127.0.0.1:6379> LPOP num
"4"
127.0.0.1:6379> LPOP num
"5"
127.0.0.1:6379>
#左进左出,栈
127.0.0.1:6379> LPUSH num2 1 2 3 4
(integer) 4
127.0.0.1:6379> lpop num2
"4"
127.0.0.1:6379> lpop num2
"3"
127.0.0.1:6379> lpop num2
"2"
127.0.0.1:6379> lpop num2
"1"
127.0.0.1:6379> lpop num2
(nil)
127.0.0.1:6379>
127.0.0.1:6379> LPUSH a 1 2 3 4 5 6 7 8 9 0
(integer) 10
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> LRANGE a 0 -1 #获取所有的元素 O(n)
1) "0"
2) "9"
3) "8"
4) "7"
5) "6"
6) "5"
7) "4"
8) "3"
9) "2"
10) "1"
127.0.0.1:6379> ltrim a 4 8 #保留区间里的值 两边都是闭区间[]
OK
127.0.0.1:6379> LRANGE a 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
127.0.0.1:6379>
#删除
127.0.0.1:6379> lpush a2 a b a b a b
(integer) 6
127.0.0.1:6379> lrange a2 0 -1
1) "b"
2) "a"
3) "b"
4) "a"
5) "b"
6) "a"
127.0.0.1:6379> lrem a2 -2 b #从右侧第2个开始删除两个b
(integer) 2
127.0.0.1:6379> lrange a2 0 -1
1) "b"
2) "a"
3) "a"
4) "a"
127.0.0.1:6379>
set类型
- ⽆序集合
- 元素为string类型
- 元素具有唯⼀性,不重复 (去重)
- 说明:对于集合没有修改操作
添加元素 sadd key member1 member2 ...
返回所有的元素 smembers key
删除指定元素 srem key
#添加
127.0.0.1:6379> SADD books python java c go
(integer) 4
127.0.0.1:6379>
127.0.0.1:6379> SADD books python java c go
(integer) 0
#查看
127.0.0.1:6379> SMEMBERS books
1) "python"
2) "go"
3) "c"
4) "java"
#删除
127.0.0.1:6379> SREM books python
(integer) 1
127.0.0.1:6379> SMEMBERS books
1) "go"
2) "c"
3) "java"
zset类型(有序集合)
- sorted set,有序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
- 说明:没有修改操作
它是一个set,保证内部value的唯一性,可以为每个value赋予一个score,表示这个value 的排序权重。
内部实现“跳跃表”的数据结构
添加
zadd key score1 member1 score2 member2 ...
127.0.0.1:6379> zadd name 4 tim 5 tom 6 tina 7 onion
(integer) 4
获取
- 返回指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
zrange key start stop
- 返回score值在min和max之间的成员
zrangebyscore key min max
- 返回成员member的score值
zscore key member
#获取name 中所有的value
127.0.0.1:6379> ZRANGE name 0 -1
1) "tim"
2) "tom"
3) "tina"
4) "onion"
#获取权重 5-7 的元素值
127.0.0.1:6379> ZRANGEBYSCORE name 5 7
1) "tom"
2) "tina"
3) "onion"
#获取onion 的权重
127.0.0.1:6379> ZSCORE name onion
"7"
删除
-
删除指定元素
zrem key member1 member2 ...
- 删除权重在指定范围的元素
zremrangebyscore key min max
#删除 成员 tom
127.0.0.1:6379> ZRANGE name 0 4
1) "tim"
2) "tom"
3) "tina"
4) "onion"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> ZREM name tom
(integer) 1
127.0.0.1:6379> ZRANGE name 0 -1
1) "tim"
2) "tina"
3) "onion"
#删除去权重在6-7 之间的成员
127.0.0.1:6379> zremrangebyscore name 6 7
(integer) 2
127.0.0.1:6379> ZRANGE name 0 -1
1) "tim"
127.0.0.1:6379>