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中
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作为列表的内部实现
常用操作
- 命令
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作为集合的内部实现
常用操作
- 命令
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的读写效率会下降
常用操作
- 命令
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(‘有序集合名’,分数下限,分数上限),查询在某个评分范围内的值有多少
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、带权重的消息队列
这些基本数都是借鉴别人的总结我自己再总结了一下,就想自己过过手,感谢发同类文章的各位大佬