Redis是一个开源的、高性能的、基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求。 Redis中所有的数据都存储在内存中,因此读写速度非常快,相比基于数据库的磁盘读写具有非常明显的优势,但是,由于Redis是存储在内存中的,存储数据的大小会受到内存的限制,而且如果服务器宕机的话数据将会丢失,当然,Redis也提供了持久化的机制来保证数据的恢复。 Redis中提供了多重的键值类型,到目前为止,Redis支持的键值类型如下: 字符串类型 string 散列类型 hash 列表类型 list 集合类型 set 有序集合类型 sorted sort 字符串类型 字符串类型是Redis中最基本的类型,能够存储任何形式的字符串,包括二进制数据,一个字符串类型允许存储的数据最大容量为512M。 字符串类型数据使用非常简单,使用set和get命令可以对一个key进行赋值和取值操作。假设有一个name=“lczd”的数据,在Redis中可以这样存储: 赋值: 127.0.0.1:6379> set name lczd OK 取值: 127.0.0.1:6379> get name "lczd" 当键不存在时会返回空结果。redis可以存储任何形式的字符串,包括整数形式,redis提供了incr命令来递增当前的键值。 如: 127.0.0.1:6379> incr num (integer) 1 如果键值不是整数时会提示错误。 还可以同时获得或者设置多个键值,如: 127.0.0.1:6379> mset name lczd age 18 OK 127.0.0.1:6379> mget name age 1) "lczd" 2) "18" 使用场景: 适合使用简单的string类型的key-value缓存场景。 hash类型 Redis是采用字典结构以键值对形式存储数据结构的,hash也是一种字典结构,存储了字段(field)和字段的映射,但是字段值只能是字符串,不能是其他类型。 散列类型适合存储对象,例如,一条商品的评价可能会存在多个回复。那么,就可以用评价的id作为key,回复id作为field,回复对象作为hash的value。 hahs类型的赋值和取值操作: hset key field value; hget key fiel; 同时设置多个值可以用:hmset命令。 127.0.0.1:6379> hset shoes price 300 (integer) 1 127.0.0.1:6379> hset shoes colour blue (integer) 1 127.0.0.1:6379> hget shoes price "300" 127.0.0.1:6379> hgetAll shoes 1) "price" 2) "300" 3) "colour" 4) "blue" 使用场景: 适合存储结构化的信息,如对象类型的信息。 列表类型 列表类型可以存储一个有序的字符串列表,常用的操作是向列表的两端添加元素或者获得列表的某一个片段。 列表类型内部使用的是双向列表实现的,对列表两端添加元素的时间复杂度为O(1)。获取越接近头部或者尾部的n条记录就越快。但是使用链表的缺点是通过索引访问元素比较慢。使用方式如下: 向列表两端添加元素和获取元素: 127.0.0.1:6379> lpush number 1 (integer) 1 127.0.0.1:6379> lpush number 2 (integer) 2 127.0.0.1:6379> rpush number 3 (integer) 3 127.0.0.1:6379> rpush number 4 (integer) 4 127.0.0.1:6379> lrange number 0 2 1) "2" 2) "1" 3) "3" 从列表删除一个元素,比如去掉左边的第一个元素: 127.0.0.1:6379> lpop number "2" 127.0.0.1:6379> lrange number 0 2 1) "1" 2) "3" 3) "4" 使用场景: 根据列表类型的特点,还可以用来实现任务队列,比如让生产者将任务使用lpush命令加入到某个键中,另一边让消费者不断的使用prop命令从该键中取出值即可。还可以在需要展示某些列表数据的场景下使用。 集合类型 集合类型中的每一个元素都是不同的,且集合没有顺序,集合类型的常用操作是向集合添加或者删除元素、判断某个元素是否存在等。 增加删除元素: 127.0.0.1:6379> sadd dress blue (integer) 1 127.0.0.1:6379> sadd dress blue white red (integer) 2 因为blue已经存在了,所以返回的是2 获取所有元素: 127.0.0.1:6379> smembers dress 1) "white" 2) "red" 3) "blue" 删除元素: 127.0.0.1:6379> srem dress blue (integer) 1 使用场景: 比如说某些去重的场景,如一个用户只能抽奖一次的这种场景。 有序集合类型 有序集合类型与集合类型的区别就是有序了,在集合类型的基础上有序集合类型为集合中的每一个元素都关联了一个分数,我们既可以使用集合类型的相关操作,还能够获得分数最高或者最低的前n个元素。 增加元素: 127.0.0.1:6379> zadd EnglishScore 90 jack 88 tom 99 lczd (integer) 3 zadd命令用来向有序集合中添加一个元素和该元素的分数。 获得排名在某个范围内的元素列表: 127.0.0.1:6379> zrange EnglishScore 0 1 1) "tom" 2) "jack" zrange命令会按照元素分数从小到大顺序返回指定范围内的元素,索引都是从0开始,负数代表从后往前查找。 使用场景: 比如说各种热门的排序场景,微博前10,播放榜单前100等等。 Redis还可以实现“发布/订阅”模式,订阅者可以订阅一个或者若干个平道(channel),发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到消息。 如: publish channel message,这样消息就发出去了。订阅频道命令 subscribe channel 127.0.0.1:6379> publish channel1.1 hello (integer) 0 127.0.0.1:6379> subscribe channel1.1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "channel1.1" 3) (integer) 1 执行subscribe命令后客户端会处于订阅状态,此时客户端无法使用除subscribe 、unsubscribe、pusbscribe、 punsubscribe以外的命令。 本文列举了Redis的五种数据类型以及最基本的使用命令,结合各个数据类型的特点,列举了一些经常使用的场景。想要了解更多的命令可以查询这个网站:https://www.cnblogs.com/JackSparrow-/p/12173080.html