Redis支持的五大数据类型:string(字符串),hash(散列),list(列表),set(集合),zset(sorted set:有序集合)

Redis中都是以key-value的方式储存数据的,这里的五大数据类型指的是value的数据类型

1.string(字符串)

  • string 是 redis 最基本的类型,以key-value的形式存在,value可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频)
  • string是二进制安全的,redis的string可以包含任何数据的二进制形式的字符串,如图片或序列化后的对象的二进制数据
  • string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB

常用操作

  • 在redis中的命令:
    set key value —>创建键值对(key不存在)或者修改键值对(key存在)
    get key —>获取key的值
    del key —>删除键值对
    append key str1 —>给key的字符串末尾追加字符串str1,如:abc —>abcqqq
    incr key —>数字形式的字符串加1
    decr key —>数字形式的字符串减1
    incrby key n —>数字形式的字符串加n
    decrby key n —>数字形式的字符串减n
  • 在python中:
    import redis
    r = redis.Redis(host=‘127.0.0.1’,port=6379)
  • 创建或修改键值对
    set(key,value,ex=None,px=None,nx=False,xx=False)
  • key:键,value:值
    ex:过期时间,单位秒
    px:过期时间,单位毫秒px
    nx:如果设置为 True,则只有 name 不存在时,当前 set 操作才执行
    xx:如果设置为 True,则只有 name 存在时,当前 set 操作才执行
  • 获取key的value
    rd.get(key)
  • 追加
    rd.append(key,value)
  • 删除键值对
    rd.append(key,value)rd.append(key,value)
  • 数字字符串加减
    rd.decr(key)
    rd.decr(key,n)
    rd.incr(key)
    rd.incr(key,n)
  • 获取所有key
    rd.keys()

2.hash(散列)

  • Redis hash 是以key-hash 的形式
  • Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
  • 内部编码
  • ziplist(压缩列表): 当field个数不超过hash-max-ziplist-entries(默认为512个)时,并且没有大value(64个字节以上算大)
  • hashtable: ziplist的两个条件只要有一个不符合就会转换为hashtablev

redis 自定义类型 redis值类型_有序集合

常用操作

  • 在redis中
    hest key field value —>创建
    hmset key field1 value1 field2 value2 field3 value3 —>创建多个
    hget key field —>获取value
    hmget key field1 field2 … —>获取多个value
    hdel key field1 [field2 …] —>删除一个或多个
    hgetall key —> 获取key中所有的field和value
  • 在python中
  • hset 一次只能添加一个键值对
  • hmset 一次可以添加多个键值对 ,值是字典形式,需要用 json.dumps({}) 把其中的字典转为 json
    rd.hset(‘key’,‘field’,‘value’)
    rd.hmset(‘key’,{‘field1’:‘value1’,‘field2’:‘value2’,‘fieldn’:‘valuen’})
  • 获取所有的value,返回的数据是包含 bytes 类型数据列表
    rd.hkeys(‘key’)
  • hget:获取一个field的值,key不存在或field不存在,都会返回 None
  • hmget:一次性获取多个field的值,key不存在,所有元素返回 None;部分field不存在,这部分返回 None
  • hgetall:获取一个key中的所有field和值,查询出来的数据是 bytes 类型
  • hexists:判断一个哈希表中是否有某个字段(field),不存在返回 None,存在返回 True
  • hlen:哈希表中有多少个字段(field),哈希表不存在,则返回 0
  • hdel:删除value
    rd.hget(key,field)
    rd.hmget(key,[field1,field2,fieldn])
    rd.hgetall(key)
    rd.hexists(name,key)
    rd.hlen(key)
    rd.hdel(‘key’,field,value)

3.list(列表)

  • key-list
  • Redis 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)
  • Redis 的list可以应用于消息队列或最新内容更新等场景
  • 内部编码
  • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置 (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用
  • linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用 linkedlist作为列表的内部实现

redis 自定义类型 redis值类型_字符串_02

常用操作

  • 命令
    lpush key value [value1 value2 …] —> 在列表key的左端插入一个或多个值
    rpush key value [value1 value2 …] —> 在列表key的右端插入一个或多个值
    lpop key —> 从列表key左端弹出一个值
    rpop key —> 从列表key右端弹出一个值
    lindex key index —> 获取列表key中index位置的值
    lrange key start end —> 获取列表key中位置在[stat,end]中的值
    llen key —> 获取列表key的长度
    lset key index 新value —> 修改列表key中index位置的value
    ltrim key start end —> 保留改列表key中位置在[stat,end]中的值,其它的删除
  • 在python中
  • rd.lpush(key,value),rd.rpush(key,value),插入
  • rd.lpop(key),rd.rpop(key),弹出
  • rd.llen(key),获取长度
  • rd.lrange(key,start,end),切片,默认返回字节的列表,需要解码
  • rd.lset(key,index,value),修改

4.set(集合)

  • key-set
  • Redis 的 Set 是 string 类型的无序集合,自带去重
  • 提供集合之间的运算,交集,并集,差集等
  • 内部编码
  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max- intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实 现,从而减少内存的使用
  • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使 用hashtable作为集合的内部实现

redis 自定义类型 redis值类型_字符串_03

常用操作

  • 命令
    sadd key member1 [member2 member3 …] —> 创建/向集合key中添加一个或多个成员
    srem key member1 [member2 member3 …] —> 删除集合key中添加一个或多个成员,返回成功删除元素的个数
    smembers key —> 获取集合key中所有成员
    scard key —> 获取集合key中所有成员数量
    sismember key member —> 判断member是否是集合key的成员
    spop key count —> 从集合key中弹出数据,count是弹出的个数,可省略,默认为1
    srandmember key [count] —> 随机从集合返回指定个数元素
    sinter key1 key2 —> 交集
    sunion key1 key2 —> 并集
    sdiff key1 key2 —> 差集
  • 在python中
  • rd.sadd(key,*members),插入元素
  • rd.scard(key),获取集合key全部元素的数量
  • rd.spop(key),从集合key中弹出一个元素
  • rd.smembers(key),获取集合key全部元素,返回字节的集合
  • rd.srem(key,member),删除集合key中的元素member
  • rd.sinter(key1,key2),交集
  • rd.sunion(key1,key2),并集
  • rd.sdiff(key1,key2),差集

5.zset(sorted set:有序集合)

  • key-zset
  • Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员
  • 不同的是每个元素都会关联一个double类型的分数,这一属性在添加和修改元素的时候可以指定,每次指定后,sorted set 会自动重新按新的值调整顺序 。redis正是通过分数来为集合中的成员进行从小到大的排序
  • zset的成员是唯一的,但分数(score)却可以重复
  • 内部编码
  • ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用
  • skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降

redis 自定义类型 redis值类型_字符串_04

常用操作

  • 命令
    zadd key score1 member1 score2 member2 … —> 创建或添加
    zcard key —> 计算成员个数
    zscore key member —> 计算某个成员的分数,如果成员不存在,则返回nil
    zrank/zrevrank key member —> 计算成员的排名,zrank是分数从低到高,zrevrank从高到低。排名类似下标索引:0,1,2,3,…
    zrem key member —> 删除成员
    zincrby key n member —> 增加成员的分数,给成员原来的分数加n
    zrange/zrevrange key start end [withscores] —> 返回指定排名范围的成员,zrange从低到高返回,zrevrange从高到低返回,start,end是开始和结束排名:0,1,2,3,…
    zrangebyscore/zrevangebyscore key score下限 score上限 withscores limit 切片开始位置 结果数量count —> 返回指定分数范围的成员,zrangebyscore从低到高,zrevangebyscore从高到低,withsores 可省略,省略后只有值没有分数,如不需要对结果切片,则 limit 切片开始位置,结果数量 可省略
    zcount key min_score max_score —> 返回指定分数范围成员个数
    zremrangebyrank key start_排名 end_排名 —> 删除指定排名内的升序元素
    zremrangebyscore key min_score max_score —> 删除指定分数范围的成员
  • 在python中
  • rd.zadd(‘有序集合名’,‘值1’,‘分数1’,‘值n’,‘分数n’),创建/添加
  • rd.zadd(‘有序集合名’,值1=评分1,值2=评分2),创建/添加
  • rd.zincrby(‘有序集合名’,值,新值),修改数据
  • rd.zrangebyscrore(‘有序集合名’,评分上限,评分下限,结果切片起始位置,结果数量,withscores=True)
    rd.zrevrangebyscrore(‘有序集合名’,评分上限,评分下限,结果切片起始位置,结果数量, withscores=True)
  • 基于分数范围进行排序,返回列表的长度,其中,结果切片起始位置,结果数量这两个参数可以同时省略,省略表示返回排序后的所有数据。
  • withscores 为 False,返回结果直接是排序好的值;True 返回的列表里面的元组,第一个是值,第二个是 分数。
  • zrangebyscore:从小到大排序
    zrevrangebyscrore:从大到小排序
  • rd.zrange(‘有序集合名’,开始位置(含),结束位置(含),desc=False,withscores=False)
    rd.zrevrange(‘有序集合名’,开始位置(含),结束位置(含),withscores=False)
  • 基于位置范围排序
  • withscores 为 False,返回结果直接是排序好的值;True 返回的列表里面的元组,第一个是值,第二个是 分数
  • zrange:对评分按照从小到大排序
    zrevrange:对评分按照从大到小排序
  • rd.zrank(‘有序列表名’,‘值’)
    rd.zrevrank(‘有序列表名’,‘值’)
  • 根据值查询排名,值查询评分
  • zrank:如果值存在,返回值的排名,排名是从 0 开始的,评分越小排名越靠前,评分越小排名越靠近 0,评分最小的值的排名为 0,值不存在,返回 None
  • zrevrank:如果值存在,返回值的排名,排名是从 0 开始的,评分越大排名越靠前,评分越大排名越靠近 0,评分最大的值的排名为 0,值不存在,返回 None
  • rd.zscore(‘有序列表名’,‘值’),查询一个值的分数
  • rd.zcard(‘有序集合名’),查询有序集合里面一共有多少个值
  • rd.zcount(‘有序集合名’,分数下限,分数上限),查询在某个评分范围内的值有多少

redis 自定义类型 redis值类型_redis 自定义类型_05

6.各个数据类型应用场景:

类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M —
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列

这些基本数都是借鉴别人的总结我自己再总结了一下,就想自己过过手,感谢发同类文章的各位大佬