首页 > 数据库 >redis的数据类型和python操作redis

redis的数据类型和python操作redis

时间:2022-11-13 10:46:23浏览次数:43  
标签:127.0 6379 python redis 数据类型 0.1 user key

一 redis的五种数据类型

类型 string(字符串类型) hash(哈希类型) list(列表类型) set(无序集合) zset(有序集合)
说明

是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型。

key: 值

用于存储对象/字典,对象/字典的结构为键值对。key、域、值的类型都为string。域在同一个hash中是唯一的。

key:{
域(属性): 值,
域: 值,
域:值,
域:值,
...
}

它的子成员类型为string。

key: [ 值1,值2, 值3.....] 

它的子成员类型为string类型,元素唯一不重复,没有修改操作,可以添加/删除成员。

key: {值1, 值4, 值3, ...., 值5}

 

它的子成员值的类型为string类型,元素唯一不重复,没有修改操作,可以添加/删除成员。权重值从小到大排列。

key: {
值1 权重值1(数字);
值2 权重值2;
值3 权重值3;
值4 权重值4;
}

 

设置操作  
"""设置操作"""
# 设置单个字符串数据
set key value # 不会过期
# 当键不存在时才能设置成功,用于一个变量只能被设置一次的情况。
setnx  key  value # 一般用于给数据加分布式锁,防止并发出现的数据不一致的情况。
# 设置多个字符串类型的数据
mset key1 value1 key2 value2 ...
# 字符串拼接
append key value # append的key如果不存在,则相当于set添加了一个字符串数据。
"""设置操作"""
# 设置指定键的单个属性
hset key field value
hset user:1 name xiaoming
# 添加子成员
# 在左侧(上方,前面)添加一条或多条数据
lpush key value1 value2 ...

# 在右侧(上方,后面)添加一条或多条数据
rpush key value1 value2 ...

# 在指定元素的左边(前免,上方)/右边(后面,下方)插入一个或多个数据
linsert key before 指定元素 value1 value2 ....
linsert key after 指定元素 value1 value2 ....
# 设置指定索引位置成员的值
lset key index value
# 删除指定成员
lrem key count value

# 注意:
# count表示删除的数量,value表示要删除的成员。该命令默认表示将列表从左侧前count个value的元素移除
# count==0,表示删除列表所有值为value的成员
# count >0,表示删除列表左侧开始的前count个value成员
# count <0,表示删除列表右侧开始的前count个value成员
 
# 添加元素
sadd key member1 member2 ...

 

 
# 添加成员
zadd key score1 member1
zadd key score1 member1 score2 member2 score3 member3 ....
# 给指定成员增加权重值
zincrby key score member
修改操作   
# 根据键获取字符串的值
get key
# 根据多个键获取多个值
mget key1 key2 ...
# 自增自减
incr num   # 相当于num+=1
decr num   # 相当于num-=1
# 获取字符串长度
strlen name
# 比特流操作(使用场景:签到记录、布隆过滤器(防止缓存击穿的一种防范手段)、打卡记录、心跳检测。)
BITCOUNT # 统计字符串的值被设置为1的bit数.
BITPOS # 返回字符串里面第一个被设置为1或者0的bit位。
SETBIT # 设置一个bit数据的值
GETBIT # 获取一个bit数据的值

 

# 签到,id为1的用户2022年第7天签到
setbit user:1:checkin:2022 7 1   
# 00000001

# 查询,用户1在2022年第7天是否上班
getbit user:1:checkin:2022 7
# 1

# 查询,用户1在2022年第3天是否上班
getbit user:1:checkin:2022 3
# 0

# 补签,用户1在2022年第4天补签
setbit user:1:checkin:2022  4 1
# 00001001

# 签到,用户1在2022年第15天签到
setbit user:1:checkin:2022 15 1
# 0000100100000001

# 统计,用户1在2022年一共签到了多少天
bitcount user:1:checkin:2022
# 3

# 查询,首次签到是什么时候
bitpos user:1:checkin:2022 1
# 4
签到功能,记录用户一年内的所有签到次数

 

# 获取hash的所有成员
hgetall key
# 获取指定键所有的域/属性
hkeys key
# 获取指定键的单个域/属性的值
hget key field
# 获取指定键的多个域/属性的值
hmget key field1 field2 ...
# 获取指定键的所有值
hvals key
# 随机抽取一个属性
hrandfield key
# 删除指定键的域/属性
hdel key field1 field2 ...
# 判断指定属性/域是否存在于当前hash中
hexists   key  field
# 属性值自增自减
hincrby key field number
# 获取hash的成员数量
hlen key

 

# 设置指定键的属性/域
127.0.0.1:6379> hset user:1 name xiaoming   # user:1 没有的key会自动创建,并因为使用hset,所以是一个hash数据类型
(integer) 1
127.0.0.1:6379> hset user:1 name xiaohong  # user:1中重复的属性name会被修改,返回值为0,是因为没有新增属性。
(integer) 0
127.0.0.1:6379> hset user:1 age 16    # user:1中没有的属性会被新增
(integer) 1
127.0.0.1:6379> hset user:1 sex 1 classmate 301   # hset可以一次性增加多个成员。
# 注意:在redis旧版本中,设置多成员可以使用hmset,新版本没有hmset
(integer) 2

# 获取hash的所有成员
127.0.0.1:6379> hgetall user:3
1) "name"
2) "xiaohong"
3) "age"
4) "17"
5) "sex"
6) "1"
# 获取键user的所有域/属性
127.0.0.1:6379> hkeys user:1
1) "name"
2) "age"
3) "sex"
4) "classmate"
# 获取指定键的单个域/属性的值
127.0.0.1:6379> hget user:3 name
"xiaohong"
# 获取指定键的多个域/属性的值
127.0.0.1:6379> hmget user:3 name sex
1) "xiaohong"
2) "1"
# 获取指定键的所有值
127.0.0.1:6379> hvals user:1
1) "xiaoming"
2) "16"
3) "1"
4) "301"
# 随机抽取一个属性
hrandfield user:3
# 删除指定键的域/属性
127.0.0.1:6379> hdel user:1 classmate age
(integer) 2
# 判断指定属性/域是否存在于当前hash中
127.0.0.1:6379> hexists user:3 age
(integer) 1
127.0.0.1:6379> hexists user:3 classmate
(integer) 0
# 属性值自增自减
# 按指定数值自增
127.0.0.1:6379> hincrby user:3 age 2
(integer) 19
127.0.0.1:6379> hincrby user:3 age 2
(integer) 21

# 按指定数值自减
127.0.0.1:6379> hincrby user:3 age -2
(integer) 19
127.0.0.1:6379> hincrby user:3 age -2
(integer) 17
# 获取hash的成员数量
127.0.0.1:6379> hlen user:3
(integer) 3
hash操作  
# 根据指定的索引获取成员的值
lindex key index
# 移除并获取列表的第一个成员或最后一个成员
lpop key  # 左侧(上方、前面)第一个成员出列
rpop key  # 右侧(下方、后面)最后一个成员出列
# lpush与lpop经常组合使用,可构建成一个栈列。rpush与lpop 或 lpush与rpop 也可以组成一个队列。

# 原子性的安全的队列
# 往列表team:4 右侧追加3个成员
rpush team:4 x y x

# 把列表team:4的末尾最后一个成员,原子操作添加到team:5的左侧
rpoplpush team:4 team:5

# 获取列表的切片
闭区间 (start, stop)
lrange key start stop

# 获取列表的长度
llen key
 
# 获取集合的所有成员
smembers key
# 获取集合的长度
scard keys
# 随机获取一个/多个成员
spop key [count=1]

# 注意:
# count为可选参数,不填则默认1个。被提取成员会从集合中被删除掉

# 删除指定元素
srem key value

# 交集,差集和并集
sinter  key1 key2 key3 ....    # 交集,比较多个集合中共同存在的成员
sdiff   key1 key2 key3 ....    # 差集,比较多个集合中不同的成员,我有你(们)没有的
sunion  key1 key2 key3 ....    # 并集,合并所有集合的成员,并去重

 

 

# 基本数据
# user:1 = {1,2,3,4}
sadd user:1 1 2 3 4
# user:2 = {1,3,4,5}
sadd user:2 1 3 4 5
# user:3 = {1,3,5,6}
sadd user:3 1 3 5 6
# user:4 = {2,3,4}
sadd user:4 2 3 4

# 交集
127.0.0.1:6379> sinter user:1 user:2
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> sinter user:1 user:3
1) "1"
2) "3"
127.0.0.1:6379> sinter user:1 user:4
1) "2"
2) "3"
3) "4"

127.0.0.1:6379> sinter user:2 user:4
1) "3"
2) "4"

# 并集
127.0.0.1:6379> sunion user:1 user:2 user:4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

# 差集
127.0.0.1:6379> sdiff user:2 user:3
1) "4"  # 此时可以给user:3推荐4

127.0.0.1:6379> sdiff user:3 user:2
1) "6"  # 此时可以给user:2推荐6

127.0.0.1:6379> sdiff user:1 user:3
1) "2"
2) "4"
交/差/并集  
# 获取集合长度
zcard key
# 获取指定成员的权重值
zscore key member
# 获取指定成员在集合中的排名
srank key member      # score从小到大的排名
zrevrank key member   # score从大到小的排名
# 获取在指定score区间的所有成员数量【闭区间】
zcount key min max
# 获取在指定score/index区间的所有成员
zrangebyscore key min max     # 按score进行从低往高排序获取指定score区间
zrevrangebyscore key min max  # 按score进行从高往低排序获取指定score区间
zrange key start stop         # 按scoer进行从低往高排序获取指定索引区间
zrevrange key start stop      # 按scoer进行从高往低排序获取指定索引区间
# 删除成员
zrem key member1
zrem key member1 member2 member3 ....
# 删除指定数量的成员
# 删除指定数量的成员,从最低score开始删除
zpopmin key [count]
# 删除指定数量的成员,从最高score开始删除
zpopmax key [count]

 

# 获取achievements中在(60,70)这个区间的数据
127.0.0.1:6379> zrangebyscore achievements 0 60
1) "xiaocao"
2) "xiaoqing"
3) "xiaolv"

127.0.0.1:6379> zrangebyscore achievements 90 100
1) "xiaobai"
2) "xiaolan"

# 获取achievements中分数最低的3个数据
127.0.0.1:6379> zrange achievements 0 2
1) "xiaocao"
2) "xiaoqing"
3) "xiaolv"


# 获取achievements中分数最高的3个数据
127.0.0.1:6379> zrevrange achievements 0 2
1) "xiaolan"
2) "xiaobai"
3) "xiaohui"
获取在指定score/index区间的所有成员
常用的业务场景  字符串string: 用于保存一些项目中的普通数据,只要键值对的都可以保存,例如,保存 session/jwt,定时记录状态,倒计时、验证码、防灌水答案  哈希hash:用于保存项目中的一些对象结构/字典数据,但是不能保存多维的字典,例如,商城的购物车,文章信息,json结构数据 列表list:用于保存项目中的列表数据,但是也不能保存多维的列表,例如,消息队列,秒杀系统,排队,浏览历史 无序集合set: 用于保存项目中的一些不能重复的数据,可以用于过滤,例如,候选人名单, 作者名单  有序集合zset:用于保存项目中一些不能重复,但是需要进行排序的数据, 例如:分数排行榜, 海选人排行榜,热搜排行 

开发中,redis常用的业务场景:

数据缓存、
分布式数据共享、
计数器、
限流、
位统计(用户打卡、签到)、
购物车、
消息队列、
抽奖奖品池、
排行榜单(搜索排名)、
用户关系记录[收藏、点赞、关注、好友、拉黑]、 ---> 无序集合

二 python操作redis

针对redis的使用,python中一般常用的redis模块有:pyredis(同步),aioredis(异步)。

pip install py-redis
# pip install aioredis

这2个模块提供给开发者的使用方式都是一致的。都是以redis命令作为函数名,命令后面的参数作为函数的参数。只有一个特殊:del,del在python属于关键字,所以改成delete即可。

1 基本使用

import json

from redis import Redis

if __name__ == '__main__':
    # 连接redis的写法有2种:
    # url格式:驱动://账户:密码@服务器IP地址:端口/数据库下标
    redis = Redis.from_url(url="redis://user:[email protected]:6379/3")
    # redis = Redis(host="127.0.0.1", port=6379, password="123", username="user", db=0)
    #
    # """字符串操作"""
    # # 终端:set name xiaohong
    # redis.set("name", "xiaohong")
    #
    #
    # # 终端:get name
    # ret = redis.get("name")
    # # redis中最基本的数据类型是字符串,但是这种字符串是bytes,所以对于python而言,读取出来的字符串数据还要decode才能使用
    # print(ret, ret.decode())
    #
    # # 不存在的数据结果是None
    # ret = redis.get("username")
    # print(ret)
    #


    # # 设置有效期的字符串
    # # 终端:setex key seconds value
    # mobile = "13312345678"
    # # redis.setex(f"code_{mobile}", 60, "2021")
    #
    # # 获取有效期
    # # 终端:ttl code_13312345678
    # t = redis.ttl(f"code_{mobile}")
    # print(t)  # 如果是过期数据,结果为-2,如果是永久数据,则结果为-1。
    #
    # # 提取数据
    # code_bytes = redis.get(f"code_{mobile}")
    # if code_bytes:  # 判断只有获取到数据才需要decode解码
    #     print(code_bytes.decode())

    """字典操作"""
    # # 设置字典
    # # 终端:hset user name xiaohong age 12 sex 1
    # # 添加单个成员
    # redis.hset("user", "id", 10)
    # # 添加多个成员
    # data = {
    #     "name": "xiaohong",
    #     "age": 12,
    #     "sex": 1
    # }
    # redis.hset("user", mapping=data)

    # # 获取字典所有成员,字典的所有成员都是键值对,而键值对也是bytes类型,所以需要推导式进行转换
    # ret = redis.hgetall("user")
    # print(ret)  # {b'name': b'xiaohong', b'age': b'12', b'sex': b'1'}
    #
    # data = {key.decode(): value.decode() for (key, value) in ret.items()}
    # print(data)



    # # 获取所有的key
    # # 终端:keys *
    # ret = redis.keys("*")
    # print(ret)  # [b'user', b'name']
    #
    # # 终端:keys *e*
    # ret = redis.keys("*e*")
    # print(ret)  # [b'user', b'name']

    # 删除key
    # if len(ret) > 0:
    #     redis.delete(ret[0])

 

标签:127.0,6379,python,redis,数据类型,0.1,user,key
From: https://www.cnblogs.com/daminghuahua/p/16885515.html

相关文章

  • python的getattr()方法,理解
    fromCNN_Datasets.R_AimportdatasetsDataset=getattr(datasets,args.data_name)#这里的getattr()方法#csdn解释#getattr(object,name[,default])......
  • python winpcap
    fromwinpcapyimportWinPcapDevicesfromwinpcapyimportWinPcapUtilsimportdpktimporttimeimportdatetime#list_device=WinPcapDevices.list_devices()......
  • python-pillow图像处理
    一、图像处理pillow是pythonimaginglibrary的简称。常见的尺寸/格式/色彩/旋转等处理。引用是为fromPILimportImage。PIL库安装目录在/Library/Frameworks/Python.fr......
  • HMM算法python实现
    基础介绍,后5项为基础5元素Q=['q0','q1','q2','q3']#状态集合States,共N种状态V=['v0','v1']#观测集合Observatio......
  • python监听串口双方收发消息内容
    使用说明使用VSPD建立一组虚拟串口查看MCU的端口号与波特率并修改python程序配置,运行即可看到双方收发的效果通过串口助手连接到虚拟串口并向其发送消息即Python显示......
  • 第一百零八篇:最常用的基本数据类型(Number,String类型)
    好家伙, 1.Number类型从名称中我们可以得出,这是一个存放数值的类型,不同的数值类型相应地也有不同的数值字面量格式number类型可以储存不同进制的数(不常用就是了)......
  • C语言数据类型转型没有搞明白的点。
    程序员面试宝典第30页,请专家指导下,感谢!1#include<stdio.h>2#defineproduct(x)((x)*(x))3intmain(intargc,char**argv){4printf("Hello,World!\n......
  • python的垃圾回收机制
    python对内存回收引用几个概念计数器:当python程序运行时,会根据数据类型的不同找到相对应的结构体,根据结构体中的字段来进行创建相关的数据。然后将对象添加到refchain双向......
  • python学习笔记(一)
    一、前言要开始准备明年的数学建模比赛了,第一次弄这个比赛先从python学习开始吧,正好学了c语言,感觉大部分都差不多。 二、基础语法有三个非常基础的语法,据我所知c中并......
  • python的深浅拷贝
    在python中,对象的赋值就是简单的引用,a=[1,2,3],b=a,在上述情况下,a和b是一样的,他们指向同一片内存,b不过是a的别名,是引用,我们可以使用bisa去判断,返回Trueb......