redis数据类型
redis 数据类型
http://www.redis.cn/commands.html
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的区别:
- list列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
- 有序集合zset类型使用散列表实现,即使读取位于中间部分的数据也很快。
- list列表中不能简单的调整某个元素的位置,但是有序集合zset可以(通过更改分数实现)
- 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
Redis 不支持事务回滚(原因)
- 大多数事务失败是因为语法错误或者类型错误,这两种错误,在开发阶段都是可以预见的
- Redis 为了性能方面就忽略了事务回滚。