数据类型

字符串类型(string)

  • 特点
  1. 字符串、数字,都会转为字符串来存储
  2. 以二进制的方式存储在内存中
  • 字符串常用命令
# 1. 设置一个key-value
set key value
# 2. 获取key的值
get key
# 3. key不存在时再进行设置(nx)
set key value nx  # not exists
# 4. 设置过期时间(ex)
set key value ex seconds

# 5. 同时设置多个key-value
mset key1 value1 key2 value2 key3 value3
# 6. 同时获取多个key-value
mget key1 key2 key3 

# 7.获取长度
strlen key
# 8.获取指定范围切片内容 [包含start stop]
getrange key start stop
# 9.从索引值开始,value替换原内容
setrange key index value
  • 数值操作
# 整数操作
incrby key 步长
decrby key 步长
incr key : +1操作
decr key : -1操作
# 应用场景: 抖音上有人关注你了,是不是可以用INCR呢,如果取消关注了是不是可以用DECR
# 浮点数操作: 自动先转为数字类型,然后再进行相加减,不能使用append
incrbyfloat key step
  • 定时操作
# 设置过期时间的两种方式
# 方式一
set key value ex 3
# 方式二
set key value
expire key 5 # 秒
pexpire key 5 # 毫秒
# 查看存活时间
ttl key
# 删除过期
persist key
  • string数据类型注意
  1. key值不宜过长,消耗内存,且在数据中查找这类键值的计算成本高
  2. 不宜过短,可读性较差
  3. 一个字符串类型的值最多能存储512M内容

列表数据类型(List)

  • 特点
  1. 元素是字符串类型
  2. 列表头尾增删快,中间增删慢,增删元素是常态
  3. 元素可重复
  4. 最多可包含\(2^{32}-1\)个元素
  5. 索引同python列表
  • 列表常用命令
# 增
#从列表头部压入元素 返回:list长度
LPUSH key value1 value2 

#从列表尾部压入元素 返回:list长度
RPUSH key value1 value2

#从列表src尾部弹出1个元素,压入到列表dst的头部 返回:被弹出的元素
RPOPLPUSH src dst

#在列表指定元素后/前插入元素
#返回:
#如果命令执行成功,返回列表的长度
#如果没有找到 pivot ,返回 -1
#如果 key 不存在或为空列表,返回 0 

LINSERT key after|before value newvalue

# 查
#查看列表中元素
#LRANGE key start stop
LRANGE key 0 -1

#获取列表长度
LLEN key

# 删
#从列表头部弹出1个元素
LPOP key

#从列表尾部弹出1个元素
RPOP key

#列表头部,阻塞弹出,列表为空时阻塞
BLPOP key timeout

#列表尾部,阻塞弹出,列表为空时阻塞
BRPOP key timeout

#关于BLPOP 和 BRPOP
#如果弹出的列表不存在或者为空,就会阻塞
#超时时间设置为0,就是永久阻塞,直到有数据可以弹出
#如果多个客户端阻塞再同一个列表上,使用First In First Service原则,先到先服务

#删除指定元素 返回:被移除元素的数量
LREM key count value
#count>0:表示从头部开始向表尾搜索,移除与value相等的元素,数量为count
#count<0:表示从尾部开始向表头搜索,移除与value相等的元素,数量为count
#count=0:移除表中所有与value相等的值

#保留指定范围内的元素 返回:ok
LTRIM key start stop

样例:
LTRIM mylist1 0 2 # 只保留前3条
# 应用场景: 保存微博评论最后500条
LTRIM weibo:comments 0 499

# 改
#将列表 key 下标为 index 的元素的值设置为 value
LSET key index newvalue

位图操作(setbit)

  • 可以实时的进行统计,极其节省空间。官方在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的统计如“日用户数”的时间消耗小于50ms, 占用16MB内存
  1. 位图不是真正的数据类型,它是定义在字符串类型中
  2. 一个字符串类型的值最多能存储512M字节的内容,位上限:\(2^{32}\)
  • SETBIT 命令
  • 设置某位置上的二进制值
  • SETBIT key offset value
  • offset : 偏移量从0开始
  • value : 0或者1
# 默认扩展位以0填充
127.0.0.1:6379> SET mykey ab
OK
127.0.0.1:6379> GET mykey
"ab"
127.0.0.1:6379> SETBIT mykey 0 1
(integer) 0
127.0.0.1:6379> GET mykey
"\xe1b"
127.0.0.1:6379> 
  • GETBIT 命令
  • 获取某一位上的值
  • GETBIT key offset
127.0.0.1:6379> GETBIT mykey 3
(integer) 0
127.0.0.1:6379> GETBIT mykey 0
(integer) 1
127.0.0.1:6379> 
  • BITCOUNT 命令
  • 统计键所对应的值中有多少个 1
  • BITCOUNT key start end
  • start : 代表的是字节索引
  • end : 代表的是字节索引
127.0.0.1:6379> SET mykey1 ab
OK
127.0.0.1:6379[4]> BITCOUNT mykey
(integer) 6
127.0.0.1:6379[4]> BITCOUNT mykey 0 0
(integer) 3

应用场景案例

# 网站用户的上线次数统计(寻找活跃用户)
    用户名为key,上线的天作为offset,上线设置为1
# 示例
    用户名为 user1:login 的用户,今年第1天上线,第30天上线
    SETBIT user1:login 0 1 
    SETBIT user1:login 29 1
    BITCOUNT user1:login

Hash散列数据类型(hash)

  1. 由field和关联的value组成的键值对
  2. field和value是字符串类型
  3. 一个hash中最多包含\(2^{32}-1\)个键值对
  4. 节约内存空间
  5. 可按需获取字段的值
  6. 只能对键进行过期操作,而不能对散列的字段进行过期操作
  7. 存储消耗大于字符串结构

基本命令操作

# 1、设置单个字段
HSET key field value
HSETNX key field value
# 2、设置多个字段
HMSET key field value field value
# 3、返回字段个数
HLEN key
# 4、判断字段是否存在(不存在返回0)
HEXISTS key field
# 5、返回字段值
HGET key field
# 6、返回多个字段值
HMGET key field filed
# 7、返回所有的键值对
HGETALL key
# 8、返回所有字段名
HKEYS key
# 9、返回所有值
HVALS key
# 10、删除指定字段
HDEL key field 
# 11、在字段对应值上进行整数增量运算
HINCRBY key field increment
# 12、在字段对应值上进行浮点数增量运算
HINCRBYFLOAT key field increment

python操作hash

# 1、更新一条数据的属性,没有则新建
hset(name, key, value) 
# 2、读取这条数据的指定属性, 返回字符串类型
hget(name, key)
# 3、批量更新数据(没有则新建)属性,参数为字典
hmset(name, mapping)
# 4、批量读取数据(没有则新建)属性
hmget(name, keys)
# 5、获取这条数据的所有属性和对应的值,返回字典类型
hgetall(name)
# 6、获取这条数据的所有属性名,返回列表类型
hkeys(name)
# 7、删除这条数据的指定属性
hdel(name, *keys)

应用场景:用户维度数据统计

用户维度统计
   统计数包括:关注数、粉丝数、喜欢商品数、发帖数
   用户为key,不同维度为field,value为统计数
   比如关注了5人
     HSET user:10000 fans 5
     HINCRBY user:10000 fans 1

python操作hash

import redis

# 创建redis数据库的连接对象
r = redis.Redis(password='123456')

# 操作hash
r.hset('pyhk1', 'username', 'aid2102')
r.hmset('pyhk1', {'age': 18, 'major': 'python'})
print(r.hget('pyhk1', 'username').decode())
print(r.hmget('pyhk1', ['username', 'age']))
print(r.hgetall('pyhk1'))
# 字典推导式
data = {k.decode(): v.decode() for k, v in r.hgetall('pyhk1').items()}
print(data)
r.hdel('pyhk1','age')
print(r.hgetall('pyhk1'))
# 删除键
r.delete('pyhk1')

集合类型(set)

  1. 无序、去重
  2. 元素是字符串类型
  3. 最多包含\(2^{32}-1\)个元素

基本命令

# 1、增加一个或者多个元素,自动去重;返回值为成功插入到集合的元素个数
SADD key member1 member2
# 2、查看集合中所有元素
SMEMBERS key
# 3、删除一个或者多个元素,元素不存在自动忽略
SREM key member1 member2
# 4、元素是否存在
SISMEMBER key member
# 5、随机返回集合中指定个数的元素,默认为1个
SRANDMEMBER key [count]
# 6、弹出成员
SPOP key [count]
# 7、返回集合中元素的个数,不会遍历整个集合,只是存储在键当中了
SCARD key
# 8、把元素从源集合移动到目标集合
SMOVE source destination member

# 9、差集(number1 1 2 3 number2 1 2 4 结果为3)
SDIFF key1 key2 
# 10、差集保存到另一个集合中
SDIFFSTORE destination key1 key2

# 11、交集
SINTER key1 key2
SINTERSTORE destination key1 key2

# 11、并集
SUNION key1 key2
SUNIONSTORE destination key1 key2

案例: 新浪微博的共同关注

# 需求: 当用户访问另一个用户的时候,会显示出两个用户共同关注过哪些相同的用户
# 设计: 将每个用户关注的用户放在集合中,求交集即可
# 实现:
    user001 = {'peiqi','qiaozhi','danni'}
    user002 = {'peiqi','qiaozhi','lingyang'}

user001和user002的共同关注为:
    SINTER user001 user002
    结果为: {'peiqi','qiaozhi'}

python操作set

import redis

r = redis.Redis(password='123456')
'''
   武将: 张飞 许褚 赵云 马超 周瑜
   文臣: 诸葛亮 周瑜 司马懿
   结果: 1.纯武将 2.纯文臣  3.文武双全  4.文臣武将
'''
# set集合类型的操作
r.sadd('武将', '张飞', '许褚', '赵云', '马超', '周瑜')
r.sadd('文臣', '诸葛亮', '周瑜', '司马懿')
data1 = r.sdiff('武将', '文臣')
result = []
for item in data1:
    result.append(item.decode())
print('纯武将:', result)

data2 = r.sdiff('文臣', '武将')
result = []
for item in data2:
    result.append(item.decode())
print('纯文臣:', result)

data3 = r.sinter('文臣', '武将')
result = []
for item in data3:
    result.append(item.decode())
print('文武双全:', result)

data4 = r.sunion('文臣', '武将')
result = []
for item in data4:
    result.append(item.decode())
print('文臣武将:', result)

有序集合类型(sortedset)

  1. 有序、去重
  2. 元素是字符串类型
  3. 每个元素都关联着一个浮点数分值(score),并按照分值从小到大的顺序排列集合中的元素(分值可以相同)
  4. 最多包含\(2^{32}-1\)元素
  • 一个保存了水果价格的有序集合
分值 2.0 4.0 6.0 8.0 10.0
元素 西瓜 葡萄 芒果 香蕉 苹果
  • 一个保存了员工薪水的有序集合
分值 6000 8000 10000 12000
元素 lucy tom jim jack
  • 一个保存了正在阅读某些技术书的人数
分值 300 400 555 666 777
元素 核心编程 阿凡提 本拉登 阿姆斯特朗 比尔盖茨

有序集合常用命令

# 在有序集合中添加一个成员 返回值为 成功插入到集合中的元素个数
zadd key score member
# 查看指定区间元素(升序)
zrange key start stop [withscores]
# 查看指定区间元素(降序)
zrevrange key start stop [withscores]
# 查看指定元素的分值
zscore key member

# 返回指定区间元素
# offset : 跳过多少个元素
# count : 返回几个
# 小括号 : 开区间  zrangebyscore fruits (2.0 8.0
zrangebyscore key min max [withscores] [limit offset count]
# 每页显示10个成员,显示第5页的成员信息: 
# limit 40 10
# MySQL: 每页显示10条记录,显示第5页的记录
# limit 40,10
# limit 2,3   显示: 第3 4 5条记录

# 删除成员
zrem key member
# 增加或者减少分值
zincrby key increment member
# 返回元素排名
zrank key member
# 返回元素逆序排名
zrevrank key member
# 删除指定区间内的元素
zremrangebyscore key min max
# 返回集合中元素个数
zcard key
# 返回指定范围中元素的个数
zcount key min max
zcount salary 6000 8000 
zcount salary (6000 8000# 6000<salary<=8000
zcount salary (6000 (8000#6000<salary<8000               
# 并集
zunionstore destination numkeys key [weights 权重值] [AGGREGATE SUM|MIN|MAX]
# zunionstore salary3 2 salary salary2 weights 1 0.5 AGGREGATE MAX
# 2代表集合数量,weights之后 权重1给salary,权重0.5给salary2集合,算完权重之后执行聚合AGGREGATE

# 交集:和并集类似,只取相同的元素
zinterstore destination numkeys key1 key2 weights weight AGGREGATE SUM(默认)|MIN|MAX

python操作sorted set

import redis

r = redis.Redis(password='123456')

# 有序集合类型的操作
r.zadd('pyzk1', {'tedu': 100, 'tedu2': 200})
print(r.zrange('pyzk1', 0, -1, withscores=True))
r.zadd('pyzk2', {'tedu2': 200, 'tedu3': 200})
# 并集运算
r.zunionstore('pyzk3',['pyzk1','pyzk2'],aggregate='sum')
print(r.zrange('pyzk3', 0, -1, withscores=True))
# 并集运算(带权重)
r.zunionstore('pyzk4',{'pyzk1':0.8,'pyzk2':0.2},
              aggregate='sum')
print(r.zrange('pyzk4', 0, -1, withscores=True))

五大数据类型及应用场景

类型 特点 使用场景
string 简单key-value类型,value可为字符串和数字 常规计数(微博数, 粉丝数等功能)
hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象 存储部分可能需要变更的数据(比如用户信息)
list 有序可重复列表 消息队列等
set 无序不可重复列表 存储并计算关系(如微博,关注人或粉丝存放在集合,可通过交集、并集、差集等操作实现如共同关注、共同喜好等功能)
sorted set 每个元素带有分值的集合 各种排行榜