string是Redis最基本的数据类型,一个key对应一个string。
string 类型是二进制安全的。意思是 redis 的 string 任意格式的二进制数据。比如jpg图片或者序列化的对象。
string 类型的值最大能存储 512M
相关常用命令 Set KEY VALUE //设置给定key的值,如果key不存在则添加,如果存在则更新值 SETEX key Seconds VALUE //为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX命令将会替换旧的值。 Get KEY //获取指定 key 的值 GETRANGE KEY start end //获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。 GETSET KEY VALUE //设置给定key的值,并返回旧值 SETNX KEY VALUE //给定key不存在时,为key设定值 MSET key1 value1 key2 value2 .. keyN valueN //同时设定多个值 INCR KEY //给定key的值+1 key对应的值不是整型会报错,value is not an integer or out of range DECR KEY //给定key的值-1 key对应的值不是整型会报错,value is not an integer or out of range 应用场景string类型是我们最常用的类型,不管是字符串,数字或者是序列化对象的缓存都可以用到。
可以利用redis的INCR、DECR等指令来实现原子计数的效果,用来实现业务上的统计计数需求。
分布式sessionkey系统。 redis可以很方便的设置sessionkey的自动过期时间,分布式系统的各个node可以统一的进行session的管理。
分布式锁。使用SETNX命令当不存在才添加,可以很好的来实现分布式锁。
其实可以看出来,我们用redis很大部分都是基于redis的高性能和单线程&原子性操作,可以把我们应用程序中多线程的复杂性和分布式环境中并发的复杂性给消除了。
HashRedis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。通过命名很清楚的之后Hash这种数据类型时使用了哈希表作为底层实现,关于什么是哈希,什么是哈希表可以自行百度,后续有时间可以单独开一篇来详细分析Redis hash的实现。
相关常用命令 Hset key field value //设置给定key 的field的value Hmset Key field1 value1 field2 value 2 //同时设置多个 field value Hget key field //获取key中指定feild的value值 Hmget key feild1 feild2 //获取多个feild的值 应用场景在前面说明string类型的时候有说到可以用string类型来操作序列化的对象,但是我们在对于对象的任何修改的时候都需要把字符串取出来然后反序列化,再进行修改,再序列化,最后存入到redis中,这样的消耗太大了,而利用hash这种数据结构就很方便的实现对象的部分字段修改。
ListRedis List是简单的字符串列表,数据结构是双向链表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),也就是兼有栈和队列的特性。因为是链表,所以查找的复杂度就是O(n)了,但是考虑到常用的指令都是在列头和列尾操作,所以这种数据结构才是最适合的。
相关常用命令 Lpush key value1 value2 //将一个或多个值插入List的头部 Rpush key value1 value2 //将一个或多个值插入List的尾部 Lpop key //移除列表头的元素 Rpop key //移除列表尾元素 BLpop key timeut//移除列表头的元素,如果没有元素会阻塞直到发现可弹出元素或者超时 LREM key count value //根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。 count> 0 从列表头向尾检索移除count个与value相等的元素并移除;count < 0 从尾向头检索移除count个与value相等的元素并移除;count = 0,移除所有与value相等的元素 应用场景
各种列表的存储
消息队列,可以利用BLpop相关的指令来实现消息队列,但是没有ack机制,需要其他方式来弥补。可以使用sorted set 来存储执行的结果,当消费消息的时候,给sorted set 添加一条数据并用时间作为score,当任务完成从sorted set中移除,定时根据score检查超时任务并重新放入list中。另一种做法就是利用list中BRPpopLpush当弹出一个值的时候,将该值添加到另一个列表,完成时利用LREM命令消除掉,这种方式不太好的地方就是不太方便进行超时任务的处理。 但是,对于消息队列,我们已经有RabbitMQ,Kafka之类成熟且机制完善的消息队列了,建议使用的时候就不用考虑用Redis来做了。当然redis支持fabu/订阅的模式(后面会详细介绍),也是Redis能作为消息队列的原因。
利用LRange实现列表的分页,但是需要注意的是LRange需要的参数start 和end,是右闭合的,也就是包含end下标所代表的项
SetRedis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。