Redis数据结构

Redis是一种高级的键值对Key-Value的存储系统,其中值Value支持五种数据类型:

  • 字符串 String
  • 字符串列表 Lists
  • 字符串集合 Sets
  • 有序字符串集合 Sorted Sets
  • 哈希 Hashs

《Redis数据结构》 Redis数据类型

String 字符串

字符串类型是Redis中最为基础的数据存储类型,在Redis中二进制是安全的,也就是说,Redis中的字符串可以接受任何格式的数据,如JPEG图像数据、JSON对象描述信息等。

Redis中字符串类型的值最大可容纳512MB的数据长度,从内部实现来看其实String可看做Byte数组,最大上限是1G字节。若仅仅使用String类型,Redis可视为加上持久化的MemCached。

《Redis数据结构》 redis原理

struct sdshdr{
  long len;//是buf数组的长度
  long free;//数组中剩余可用字节,可理解为什么string类型是二进制安全的,本质上就是byte数组,可包含任何数据了。
  char buf[];//buf是个char数组用于存储实际的字符串内容。
}

另外,String类型可被部分命令按int处理,比如incr等命令,若只用String类型,Redis就可被看做加上持久化特性的MemCached。当然Redis对String类型的操作比memcached要多的多。

String数据结构是简单的KV类型,Value不仅可以是String,也可以是数字。使用String类型,可完全实现目前MemCache功能,并且效率更高,可享受Redis的定时持久化,可选择RDB模式或AOF模式。

String字符串类型的操作

$ redis-cli
  • set key value 设置key对应的值为string的value
# 设置key对应的string类型的value
> set name junchow
  • append key value 给指定key的字符串追加value
# key值追加字符串
> append name 520
"junchow520"
  • substr key start end 返回从key中截取后的key的字符串值
# 截取key值,从起始下标到终止下标
> substr name 0 6
"junchow"
  • mset key1 value1 ... keyN valueN 一次性设置多个key的值
# 批量设置多个key值
> mset name junchow age 30 gender male 
OK
  • mget key1 key2 ... keyN 一次性获取多个key的值
# 批量获取多个key值
> mget name age gender
  • incr key 对key的值做自增操作
# 为key值自增并返回新值
> incr age
31
  • decr key 对key的值进行自减操作
# 为key值自减并返回新值
> decr age
30
  • incrby key integer 对key的值进行增加n
# key值增加指定量
> incrby age 10
40
  • decrby key integer 对key的值进行减少n
# key值减少指定量
> decrby age 5
35
  • setnx 设置Key对应的值为String类型的Value,若Key已存在值不变并返回0,nxnot exists的意思。
$ get name
"junchow"

$ setnx name zhoujun
(integer) 0

$ get name
"junchow"
  • setex 设置Key对应的值为String类型的Value,并指定此键值对应的有效期。

List 链表类型

Lists of binary-safe strings

List类型实质上是一个双向链表,通过push、pop操作从链表的左侧头部或右侧尾部添加或删除元素,因此List即可用作栈也可用作队列。

应用场景: 获取最新10个登录用户信息

-- 使用SQL语句实现
SELECT * FROM user ORDER BY logintime DESC LIMIT 10

在数据量大时使用SQL语句查询时数据库所有数据都要受到影响,对数据库的负载比较高。必要情况下给关键字段设置索引,索引也比较耗费系统资源。
若通过redis的list链表实现,可在list链表中仅保留最新的10个数据,每次进入一个新数据就删除一个旧元素,就可以从链表中直接获得需要的数据,极大节省各方面资源消耗。

《Redis数据结构》 链表操作

List 链表类型操作

$ redis-cli

# 在key对应list的左侧头部添加元素
> lpush loginuser alice
> lpush loginuser ben
> lpush loginuser carl
> lpush loginuser dan

# 获取list长度,key不存在则返回0,若key对应类型不是list则返回错误
> llen loginuser

# 返回指定区间内的元素,下标从0开始
> lrange loginuser 0 -1

# 截取list保留指定区间内的元素
> ltrim loginuser 0 -1

# 从list头部删除元素并返回删除的元素
> lpop loginuser

# 从list右侧尾部删除元素并返回删除元素
> rpop loginuser

# 在key对应的list的尾部添加
> rpush loginuser elva
> rpush loginuser fifi

> 对于List双向链表的结构,若上进上出(先进后出)就是栈,若上进下出(先进先出)就是队列。所以List即可作为栈又可作为队列。
    原文作者:JunChow520
    原文地址: https://www.jianshu.com/p/b1662bd56e86
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞