redis数据类型

  |   0 评论   |   0 浏览

redis 数据类型
http://www.redis.cn/commands.html

image.png

String 类型

incr 递增;

incrby: 递增几

setnx 不存在才赋值

getset: 设置值并返回旧值

mset: 同时设置多个值, mset k1 v1 k2 v2 k3 v3

hash 类型

key是字符串: value类似于map

存一个值: hset key field value:

hset user username lisi 
hset user age 33

存多个值:

hmset user age 20 username lisi

取多个值:

hmget user age name

取所有值

hgetall user

删除某个filed

hdel user age

自增

hincrby key filed increment

判断某个字段是否存在

hexists user age

只获取key里面的字段名: hkeys user

只获取key里面的字段值: hvals user

获取字段数量 hlen key

list

lpush list 1 2 3 4 5 #list最左端是5

rpush list a b c d a f # list最右端是f

lpop list 移除并返回最左端元素

rpop list 移除并返回最右端元素

lrange list 0 -1 返回所有元素

llen list 获取元素个数

lrem 删除列表中指定个数的值: lrem key count value

LREM key count value 命令会删除列表中前 count 个值为 value 的元素,返回实际删除的元素个数。根据 count 值的不同,该命令的执行方式会有所不同:

  • 当count>0时, LREM会从列表左边开始删除。
  • 当count<0时, LREM会从列表后边开始删除。
  • 当count=0时, LREM删除所有值为value的元素。

LINDEX key index 获取指定索引的元素值

lset key index value 设置指定索引的元素值

ltrim key start stop 只保留列表指定片段,指定范围和lrange 一致

127.0.0.1:6379> lrange l:list 0 -1 
1) "6" 
2) "5" 
3) "0" 
4) "2" 
127.0.0.1:6379> ltrim l:list 0 2 
OK
127.0.0.1:6379> lrange l:list 0 -1 
1) "6" 
2) "5" 
3) "0"

set

添加 sadd user zhangsan lisi

删除 srem user zhangsan

获取所有元素 smembers user

判断集合中是否存在元素 sismember user lisi

集合运算:

差集: sdiff seta setb # 属于seta 并且不属于 setb的元素

127.0.0.1:6379> sadd setA 1 2 3 

(integer) 3 

127.0.0.1:6379> sadd setB 2 3 4 

(integer) 3 

127.0.0.1:6379> sdiff setA setB 

1) "1" 

127.0.0.1:6379> sdiff setB setA 

1) "4"

sinter: 交集
sinter seta setb # 属于seta 并且也属于 setb的

127.0.0.1:6379> sinter setA setB 

1) "2" 

2) "3"

sunion 并集
sunion seta setb # 属于seta 或者属于setb的

127.0.0.1:6379> sunion setA setB
1) "1" 

2) "2" 

3) "3" 

4) "4"

获取集合元素个数 scard
scard key

从集合中随机弹出一个元素 spop key

zset

在 set 集合类型的基础上,有序集合类型为集合中的每个元素都 关联一个分数 ,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作.

zset 和list 的相似处:

1.二者都是有序的, list是插入的顺序排序。 zset 是插入后根据分数自然顺序排序.
2. 二者都可以获得某一范围内的元素。

zset 和 list的区别:

  1. list列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
  2. 有序集合zset类型使用散列表实现,即使读取位于中间部分的数据也很快。
  3. list列表中不能简单的调整某个元素的位置,但是有序集合zset可以(通过更改分数实现)
  4. zset有序集合要比列表list类型更耗内存。

添加元素
zadd key score number

127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu 

(integer) 3 

127.0.0.1:6379> zadd scoreboard 97 lisi 

(integer) 0

zrange/zrevrange 获取某个索引范围内的元素列表(包含两端元素)

127.0.0.1:6379> zrange scoreboard 0 2 

1) "zhangsan" 

2) "wangwu" 

3) "lisi“ 

127.0.0.1:6379> zrevrange scoreboard 0 2 

1) " lisi " 

2) "wangwu" 

3) " zhangsan “

如果需要连分数一起获得 在尾部加上 withscores

127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES 

1) "zhangsan" 

2) "80" 

3) "wangwu" 

4) "94"

zscore 获取元素的分数

127.0.0.1:6379> zscore scoreboard lisi
"97"

zrem 删除元素:

127.0.0.1:6379> zrem scoreboard lisi 

(integer) 1

zrangebyscore 获取指定分数范围内的元素.

127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES 

1) "wangwu" 

2) "94" 

3) "lisi" 

4) "97" 

127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2 

1) "wangwu" 

2) "lisi"

增加某个元素的分数 zincrby

127.0.0.1:6379> ZINCRBY scoreboard 4 lisi 

"101“

zcard 获取集合中元素的数量

127.0.0.1:6379> ZCARD scoreboard 

(integer) 3

zcount 获取指定分数范围内的元素个数 zcount key min max

127.0.0.1:6379> ZCOUNT scoreboard 80 90 

(integer) 1

zremrangebyrank 按照排名范围删除元素 zremrangebyrank key start stop

127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1 

(integer) 2 

127.0.0.1:6379> ZRANGE scoreboard 0 -1 

1) "lisi"

zremrangebyscore 按照分数范围删除元素 zremrangebyscore key min max

127.0.0.1:6379> zadd scoreboard 84 zhangsan 

(integer) 1 

127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100 

(integer) 1

获取元素的排名 zrank(从小到大)/zrevrank (从大到小)

127.0.0.1:6379> ZRANK scoreboard lisi 

(integer) 0 

127.0.0.1:6379> ZREVRANK scoreboard zhangsan 

(integer) 1

通用命令

keys 获取满足给定pattern的所有key
del 删除
exists 是否存在
expire 设置过期时间

EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除 

TTL key 查看key生于的生存时间 

PERSIST key 清除生存时间 

PEXPIRE key milliseconds 生存时间设置单位为:毫秒

rename 重命名key
type 判断key的类型

redis消息模式

队列模式

lpush, rpop

消息接收方如果不知道队列中是否有消息,会一直发送rpop命令,如果这样的话,会每一次都建立一次连接,

这样显然不好。

可以使用brpop命令,它如果从队列中取不出来数据,会一直阻塞,在一定范围内没有取出则返回null、

发布订阅

发布消息 publish channela "你好"
订阅频道 subscribe channela
取消订阅频道 unsubscribe channela

redis事物

Redis 的事务是通过 MULTI 、 EXEC 、 DISCARD 和 WATCH 、UNWATCH这五个命令来完成的。

Redis 的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。

Redis 将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行

Redis 不支持回滚操作。

multi:

用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化地执行这个命令序列

exec

在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态

discard

清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态

watch

watch key [key...]

当某个[事务需要按条件执行]时,就要使用这个命令将给定的[键设置为受监控]的状态.

unwatch

清除所有先前为一个事务监控的键。

127.0.0.1:6379> multi 

OK

127.0.0.1:6379> set s1 111 

QUEUED 

127.0.0.1:6379> hset set1 name zhangsan 

QUEUED 

127.0.0.1:6379> exec 

1) OK 

2) (integer) 1 

127.0.0.1:6379> multi 

OK

127.0.0.1:6379> set s2 222 

QUEUED

127.0.0.1:6379> hset set2 age 20 

QUEUED 

127.0.0.1:6379> discard 

OK

127.0.0.1:6379> exec 

(error) ERR EXEC without MULTI 

127.0.0.1:6379> watch s1 

OK

127.0.0.1:6379> multi 

OK

127.0.0.1:6379> set s1 555 

QUEUED 

127.0.0.1:6379> exec # 此时在没有exec之前,通过另一个命令窗口对监控的s1字段进行修改 

(nil) 

127.0.0.1:6379> get s1 

111

image.png
Redis 不支持事务回滚(原因)

  1. 大多数事务失败是因为语法错误或者类型错误,这两种错误,在开发阶段都是可以预见的
  2. Redis 为了性能方面就忽略了事务回滚。

标题:redis数据类型
作者:码农路上
地址:http://wujingjian.club/articles/2021/04/08/1617867958363.html