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 的五种数据类型以及最基本的使用命令, 结合各个数据类型的特点, 列举了一些经常使用的场景. 想要了解更多的命令可以查询这个网站: http://redisdoc.com/
来源: https://www.cnblogs.com/JackSparrow-/p/12173080.html