Redis数据类型
命令大全:http://www.redis.cn/commands.html
存储数据是通过key-value格式存储数据的,其中value可以定义五种数据类型
string、hash、list、set、zset
在 redis 中的命令语句中,命令是忽略大小写的,而 key 是不忽略大小写的
1、string类型
赋值
set key value
取值
get key
取值并赋值
getset key value
递增数字
incr key
递减数字
decr key
增加指定的整数
incrby key increment
减少指定的整数
decrby key decrement
仅当不存在时赋值
setnx key value(设置成功返回1,失败返回0)
查看是否存在某个key
exist key
向尾部追加值(若不存在该键则设置为value,若存在则追加,返回值为追加后字符串的总长度)
append key value
获取键对应值的长度(若键不存在则返回0)
strlen key
同时设置多个键值
mset k1 v1 k2 v2 k3 v3
同时获取多个键值
mget k1 k3
应用:自增主键
2、hash类型
也叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型
赋值
hset key field value(hset命令不区分插入和更新操作,当执行插入操作时hset命令返回1,当执行更新操作时返回 0 。)
设置多个字段值
hmset key field1 value1 field2 value2...
当字段不存在时赋值(类似 HSET,区别在于如果字段存在,该命令不执行任何操作;如果不存在则设置该字段值,并且返回0)
hsetnx key field value
获取一个字段值
hget key field
获取多个字段值
mget key field1 field2...
获取所有字段值
hgetall key
删除字段
hdel key field1 field2...
增加数字
hincrby key field increment
判断字段是否存在
hexists key field
只获取字段名或字段值
hkeys key
hvals key
获取所有字段(包括key和value)
hgetall key
应用:商品信息
注:
string类型和hash类型的区别
hash类型适合存储对象数据,尤其对象属性经常发生【增删改】操作的数据。
string类型也可以存储对象数据,将java对象转成json字符串进行存储,适合【查询】操作。
3、list类型
ArrayList与LinkedList的区别
ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要涉及到位移操作,所以比较慢。
LinkedList使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元素或后几个元素速度比较快。
list类型存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
列表类型内部是使用双向链表( double linked list )实现的,所以向列表两端添加元素的时间复杂度为0(1) ,获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的
左侧添加元素
lpush key value1 value2 value3...
右侧添加元素
rpush key value1 value2 value3...
左侧从start到stop位置取出元素
lrange key start stop
弹出左边元素,并返回该值
lpop key
弹出右边元素,并返回该值
rpop key
获取列表中元素的个数
llen key
删除列表中指定个数的值(count大于0从列表左边开始删除,小于0从右边开始删除,等于0删除所有值为value的元素,返回的是实际删除的个数)
lrem key count value
获得指定索引的元素值
lindex key index
设置指定索引的元素值
lset key index value
应用:商品评论列表
4、set类型
集合类型,数据是不重复且没有顺序。
常用操作是向集合中加入或删除元素、判断某个元素是否存在等。操作的时间复杂度都为 0(1) (集合类型的 Redis 内部是使用值为空的散列表实现)。
添加元素
sadd key member1 member2...
删除元素
srem key member1 member2...
获得集合中的所有元素
smembers key
判断元素是否在集合中
sismember key member
差集key1-key2
sdiff key1 key2
交集key1和key2
sinter key1 key2
并集key1和key2
sunion key1 key2
获取集合中元素个数
scard key
从集合中弹出一个元素。(由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出)
spop key
5、zset类型
在 set 集合类型的基础上,有序集合类型为集合中的每个元素都 关联一个分数 ,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
有序集合和列表类型有些相似,都是有序、都可以获得某一个范围的元素;但也有着很大区别(访问速度,内存消耗、元素位置):
列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
列表中不能简单的调整某个元素的位置,但是有序集合可以修改分数实现
有序集合要比列表类型更耗内存。
增加元素
zadd key score1 member1 score2 member2...
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素( 如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数)
zrange key start stop
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素( 如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数)
zrevrange key start stop
获取元素的分数
zcore key member
删除元素(当key存在但不是有序集合类型时,返回一个错误)
zrem key member1 member2...
获得指定分数范围的元素
zrangebyscore key min max [WITHSCORES]
增加某个元素的分数
zincrby key increment member
获取集合中元素的数量
zcard key
获取指定分数范围的元素个数
zcount key min max
应用:商品销售排行榜
6、通用命令
返回满足给定值的所有key
keys pattern
删除key
del key
确认key是否存在
exists key
expire(重点)
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
expire key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
ttl key 查看key的生存时间
prersist key 清除生存时间
prepire key milliseconds 生存时间设置单位为:毫秒
重命名key
rename oldkey newkey
显示key类型
type key
Redis消息模式
1、队列模式
使用list类型的lpush和rpop实现消息队列
消息接收方如果不知道队列中是否有消息,会一直发送rpop命令,如果这样的话,会每一次都建立一次连接,这样显然不好。
可以使用brpop命令,它如果从队列中取不出来数据,会一直阻塞,在一定范围内没有取出则返回null
2、发布订阅模式
订阅消息(subscribe)
subscribe kkb-channel
发布消息(publish)
publish kkb-channel "hello"
Redis事务
1、redis事务介绍
通过MULTI 、EXEC、DISCARD和WATCH、UNWATCH这五个命令来完成的
Redis 的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。
Redis 将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行
Redis 不支持回滚操作
2、事务命令
MULTI
用于标记事务块的开始
Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化地执行这个命令序列。
EXEC
在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态
DISCARD
清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。
WATCH
当某个[事务需要按条件执行]时,就要使用这个命令将给定的[键设置为受监控]的状态。
watch key
注意事项:使用该命令可以实现 Redis 的乐观锁
UNWATCH
清除所有先前为一个事务监控的键。
Redis 不支持事务回滚(为什么呢)
大多数事务失败是因为语法错误或者类型错误,这两种错误,在开发阶段都是可以预见的
Redis 为了性能方面就忽略了事务回滚。