在Redis中有五种数据类型:字符串、字符串列表、有序字符串集合、哈希、字符串集合,其中比较常用的是字符串和哈希类型。关于Redis我们知道它是关于key-value键值对的形式,那么在key定义需要注意的点为:key不要过长,最好不超过1024个字节;统一的命名规范。其实并不是强制的,只是为了程序的可读性。
一、字符串
字符串类型是Redis中最为基础的存储类型,在Redis中是以二进制方式来进行操作(二进制安全),这便意味着该类型存入和获取的数据是相同的,字符串类型的Value最多可以容纳数据的长度为512M。
存储String的常用命令:赋值、取值、删除、数值增减、扩展命令。
其中set、get在最开始讲过就不管了,getset命令是先获取值在对key进行赋值;使用del删除对应的key-value对;incr是递增key对应的value,如果该key-value对不存在,则会将value设置初始值为0,然后进行递增;如果该key对应的value无法进行递增则会抛出错误;decr递增,意义和incr相似。
以上是一些扩展命令,incrby和decrby是增加递减响应的数据而不仅仅是1,其余意义和decr、incr相同;append是追加,在对应key的value后面追加字符串,返回字符串的长度。
二、哈希
Redis中的哈希类型可以看做是具有字符串类型的key和字符串类型的value的一个Map容器,每一个Hash看可以存储42亿左右个键值对。
存储hash常用命令:赋值、删除、取值、增加数字、自学命令
hexists查看哈希中是否存在某个属性;通过del可以删除整个哈希;hkeys、hvals获取哈希中的属性和值;hlen获取哈希中属性的长度;hgetall获取所有键值对。
三、list
在Redis中list类型是按照插入顺序排序的字符串链表,和数据结构中的普通链表是一样的,我们可以在头部和尾部添加新的元素。在插入的时候如果该键不存在,那么Redis就会为这个键创建一个新的链表;与此相反,如果链表中所有元素都被移除了,那么该键也会被从数据库中删除。
从元素的插入和删除效率来看,如果是在链表两头插入和删除元素是非常高效的,就算链表中存在了百万条记录,这个操作也可以在常量时间内完成。如果元素插入和删除的操作作用在链表中间,那么这个时候效率就会比较低。
list的存储:ArrayList(使用数组方式,根据索引查询数据速度很快,但是插入和删除就搬家就会比较慢)、LinkedList(使用双向链表方式,插入删除数据快)
存储list常用命令:两端添加、查看列表、两端弹出、获取列表中元素个数、扩展命令等
lpush往链表头部增加数据;rpush往链表尾部增加数据;lrange查看列表的记录,参数分别为起始和结束位置,如果为-x的话则从链表尾端数第几个开始;lpop弹出链表头部数据;llen查看链表元素数;lpushx效果和lpush类似,但是如果对应key不存在则不添加;lrem key count value从头开始删除count个值为value的数
lset key index value设置下标为index的值为value;linsert key before/after value1 value2向链表中值为value1的元素前/后插入值为value2的数据;rpoplpush key1 key2将链表key1尾部的数据移到key2头部中。
rpoplpush使用场景:redis的list经常用于消息队列的服务完成多个程序之间消息的交互,假设一个程序正在实现lpush向链表中添加新的元素,即生产者;另一个程序正在执行rpop从链表中取出元素,即消费者,与此同时,消费者程序在取出元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,那么就可以认为消息已经丢失,由此可能导致业务数据的丢失或者是业务状态不一致状态的尝试,利用rpoplpush那么消费者在消息队列中取出元素后再将其插入到备份中,直到消费者程序完成正常逻辑处理后再将消息从备份队列中删除,当备份消息队列中消息过期后可以重新存入到主消息队列。
四、set
在Redis中可以将set类型看做为没有排序的字符集合,和list集合一样,也可以在该类型的数据值上执行添加、删除或判断某个元素是否存在的操作;和list类型不同,set集合不允许出现重复的元素,和list相比set在功能上还存在着很重要的特性就是在服务器端完成多个set之间的聚合计算操作,set可以包含的最大元素数量也是42亿左右。
set常用命令:添加/删除元素、获取集合中的元素、集合的差/交/并集运算、扩展命令
sadd/srem向集合增加/移除元素;smember查看集合中的元素;sismember查看集合中是否存在某个元素;sdiff求差集,和集合key的顺序相关;sinter求交集;sunion求并集;scard查看集合中元素个数;srandmember随机获取其中一个元素;sdiffstore获取两个集合的差集并存入到新的集合中;sinterstore、sunionstroe同理。
可以使用redis的set数据类型跟踪一些具有唯一性的数据,如访问CSDN博客的唯一IP地址信息,这种我们仅需要在每次访问该博客的时候将该访问者的IP存入到redis中,set数据类型就会自动保证IP地址的唯一性;还可以充分利用set类型的服务器端聚合操作方便高效用于维护数据对象之间的关联关系,比如将购买某一商品的用户id信息存储到set数据类型中,购买另一种商品的用户id存储到另一个set数据类型中,想知道哪些用户同时购买了两个商品就可以使用set的交集操作。
五、sorted-set
sorted-set和set类型极其相似,都不允许重复成员,其区别就是sorted-set中的每个成员都会有分数与之关联,sorted-set就是根据这个分数对成员进行从小到大的排序,虽然sorted-set中的成员是唯一的,但是分数是可以重复的。sorted-set的成员在集合中的位置是有序的,即便是访问集合中部的成员也是非常高效的(二分查找?),其应用如游戏的排序,微博的热点话题等场景上。
sorted-set常用命令:添加、获取、删除、范围查询、扩展命令
zadd/zrem增加/删除数据;zscore查看分数;zcard查看集合元素个数;zrange/zrevrange按排序范围顺序/反序查看元素,可以跟withscores输出分数;zremrangebyrank按排序范围删除元素;zremrangebyscore按分数范围删除元素;zrangebyscore按分数范围查看元素,可以跟limit限制条数。
sorted-set用于大型有序的积分排行版,当玩家分数发生变化时可以使用zadd更新玩家分数,然后通过zrange获取积分排行信息;或构建索引数据。