Python3操作Redis最新版|CRUD基本操作(保姆级)


Python3中类的高级语法及实战

Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案

Python3数据科学包系列(一):数据分析实战

Python3数据科学包系列(二):数据分析实战

Python3数据科学包系列(三):数据分析实战

Win11查看安装的Python路径及安装的库

Python PEP8 代码规范常见问题及解决方案

Python3操作MySQL8.XX创建表|CRUD基本操作

Python3操作SQLite3创建表主键自增长|CRUD基本操作

anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter

Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数

Python函数绘图与高等代数互融实例(二):闪点函数

Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线

Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域

Python函数绘图与高等代数互融实例(五): 则线图综合案例

Python3操作MongoDb7最新版创建文档及CRUD基本操作



 Python3操作Redis官方详细文档

Java OR Mapping  Redis文档: 

Adding Redis OM Spring Java对象到Redis对象关系映射高级应用

对象关系映射Maven三角坐标

Python操作Redis高级方式: 异步操作Redis|管道|事务等操作 

找准文档,对症下药,精准匹配,求人不如求文档,码农小菜鸟



                                                              精准扶贫|保姆服务 


 



一: Redis连接


认知升维

Python3连接Redis操作 StrictRedis跟Redis的区别在于,StrictRedis用于实现大部分官方命令,并使用官方的语法和命令,Redis是StrictRedis的子类,兼容一些老版本。 Redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。

import redis"""Python3连接Redis操作StrictRedis跟Redis的区别在于,StrictRedis用于实现大部分官方命令,并使用官方的语法和命令,Redis是StrictRedis的子类,兼容一些老版本。Redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用。
"""
print("当前python引入的Redis版本", redis.__version__)
linkRedis = None
try:linkRedis = redis.StrictRedis(host='192.168.1.111', port=6379, db=0)  # 指定IP地址、端口、指定存放数据库# 如果指定一些其他参数,可以看源码,将需要的参数进行指定。print(linkRedis.dbsize())
except Exception as err:print("redis连接异常: ", err)
finally:if linkRedis is not None:print("释放连接资源")linkRedis.close()print("""连接池:redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。每个redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
""")pool = redis.ConnectionPool(host='192.168.1.111', port=6379, decode_responses=True)
redisLink = None
try:redisLink = redis.Redis(connection_pool=pool)
except Exception as err:print("redis连接异常: ", err)
finally:if linkRedis is not None:print("redis连接还给连接池")redisLink.close()


运行效果:


D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\ClassGrammarRedisExecutorLinkcreate.py 
当前python引入的Redis版本 5.0.1
0
释放连接资源

   连接池:
       redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。每个redis实例都会维护一个自己的连接池。
       可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。

redis连接还给连接池

Process finished with exit code 0
 

二: Python操作Redis插入数据

import timeimport redis"""Python3连接Redis插入数据
"""
pool = None
redisLink = None
try:pool = redis.ConnectionPool(host='192.168.1.111', port=6379, decode_responses=True)redisLink = redis.Redis(connection_pool=pool)result = redisLink.set('key', '你好,欢迎来到Python3操作(Redis7.2.0)Redis应用')  # key 代表是键  value:hello redis 代表是值print("""
字符串操作,redis中的String再内存中按照一个name对应一个value来存储。
set(name, value, ex=None, px=None, nx=False, xx=False)
再Redis中设置值,不存在则创建、存在即修改
参数:ex:过期时间(秒)px:过期时间(毫秒)nx:如果为True,当name不存在时,当前set操作会执行xx:如果为True,当name存在时,当前set操作会执行""")print(result)  # 打印结果:True 说明设置成功print("获取Key对应的值: ", redisLink.get('key'))# ex: 设置过期时间(单位:秒)  name为Key  '老杨' 为valueredisLink.set("name", "老杨", ex=3)time.sleep(1)resultValue = redisLink.get('name')print("请叫我:%s" % resultValue)time.sleep(3)print("3秒后请叫我无名小卒")print('name = %s' % (redisLink.get('name')))except Exception as err:print("redis连接异常: ", err)
finally:print()if redisLink is not None:print("释放资源,连接还给连接池")redisLink.close()

运行效果:


D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\ClassGrammarRedisExecutorInsert.py 

字符串操作,redis中的String再内存中按照一个name对应一个value来存储。
set(name, value, ex=None, px=None, nx=False, xx=False)
再Redis中设置值,不存在则创建、存在即修改
参数:
    ex:过期时间(秒)
    px:过期时间(毫秒)
    nx:如果为True,当name不存在时,当前set操作会执行
    xx:如果为True,当name存在时,当前set操作会执行

    
True
获取Key对应的值:  你好,欢迎来到Python3操作(Redis7.2.0)Redis应用
请叫我:老杨
3秒后请叫我无名小卒
name = None

释放资源,连接还给连接池

Process finished with exit code 0
 

三: Python3操作Redis查询数据


import time
import redis"""Python3连接Redis查询数据
"""
pool = None
redisLink = None
try:pool = redis.ConnectionPool(host='192.168.1.111', port=6379, decode_responses=True)redisLink = redis.Redis(connection_pool=pool, encoding='UTF-8')print("""getrange(key, start, end):获取子序列(根据字节获取,非字符)一个汉字3个字节 1个字母一个字节 每个字节8bit参数:name:redis的namestart:起始位置(字节)end:结束位置(字节)""")redisLink.set('detail', '详情信息')# 取索引号是0-2 前3位字节print(redisLink.getrange('detail', 0, 2))# 取所有的信息print(redisLink.getrange('detail', 0, -1))# 输出结果:详情信息redisLink.set('title', 'good')print(redisLink.getrange('title', 0, 2))# 输出结果:gooprint(redisLink.getrange('title', 0, -1))# 输出结果:goodprint()print("""incr(name, amount=1):自增name对应的值,当name不存在时,创建name=amount,存在则自增参数:name:redis的nameamount:自增数(必须是整数)""")print()# 自增name='incr' 每次自增 +1redisLink.incr('incr', amount=1)print(redisLink.get('incr'))# 输出结果:+1# 应用场景:记录页面的点击次数。print()print("""incrbyfloat(name, amount=1.0):自增name对应得值,当name不存在时,创建name=amount,存在则自增参数:name:redis的nameamount:自然数(浮点数)""")# 设置name='num'redisLink.set('num', '0.00')print(redisLink.get('num'))# 输出结果:0.00# 自增浮点数redisLink.incrbyfloat('num', amount=1.0)print(redisLink.get('num'))print("""decr(name, amout=1):自减name对应的值,当name不存在时,创建name=amount,存在则自增参数:name:redis的nameamount:自减数(整数)""")# 先查询name='num' 是否存在, 若存在 将对应的value 自减 1 ,不存在创建redisLink.decr('num', amount=1)print(redisLink.get('num'))# 输出结果: -1print()print("""append(key, value):再redis name对应的值后面追加内容参数:key:redis的namevalue:追加的字符串""")# 原name='name' 对应的value='老杨'redisLink.append('name', 'laogao')print('拼接后的字符串为: ', redisLink.mget('name'))# 输出结果:['老杨laogao'] 将value 拼接再一起print("操作列表")print()print("""lpush(name, values):从左边新增加,不存在就新建""")# 往name='list' 中从左添加value=[11, 22, 33]redisLink.lpush('list', 11, 22, 33)print(redisLink.lrange('list', 0, -1))# 输出结果:['33', '22', '11']  保存顺序为 33,22,11print("""rpush(name, values):从右边新增加,不存在就新建""")# name='list1' 中从右添加value=[66, 55, 44]redisLink.rpush('list1', 66, 55, 44)print(redisLink.lrange('list1', 0, -1))# 输出结果:['66', '55', '44']print("""llen(name):获取列表长度""")# 获取name='list1' 列表中的长度 value=[66, 55, 44]print(redisLink.llen('list1'))# 输出结果: 3print("""lpushx(name, value):往已经有的name的列表的左边添加元素,没有的话无法创建""")# 首先redis数据库中没有name='list2'redisLink.lpushx('list2', 10)print(redisLink.lrange('list2', 0, -1))# 输出结果: []print("""rpushx(name, value):往已经有的name的列表的右边添加元素,没有的话无法创建""")# 首先redis数据库中没有name='list2'redisLink.rpushx('list2', '10')print(redisLink.lrange('list2', 0, -1))# 输出结果: []print("""linsert(name, where, refvalue, value):在name对应的列表的某一个值前或后插入一个新值参数:name:redis的namewhere:BEFORE或AFTERrefvalue:标杆值 (以它为基础, 前后插入新值)value:要插入的数据""")# 往列表中左边第一个出现的元素"66"前插入元素"77", 若name不存在, 不会新创建, 会返回[]redisLink.linsert('list1', 'before', '66', '77')  # 目前数据库list1=[66, 55, 44]print(redisLink.lrange('list1', 0, -1))# 输出结果: ['77', '66', '55', '44']print("""lset(name, index, value):对name对应的list中的某一个索引位置重新赋值参数:name:redis的nameindex:list的索引位置value:要设置的新值""")# 将list1中索引为3, 替换成'33', list1=['77', '66', '55', '44']redisLink.lset('list1', 3, '33')print(redisLink.lrange('list1', 0, -1))# 输出结果: ['77', '66', '55', '33']print("""lrem(name, value, num):name对应的list中删除指定的值参数:name:redis的namevalue:要删除得值num:num=0,删除列表中所有的值num=2,从前向后,删除2个;num=-2, 从后向前,删除2个;""")# list1=['77', '66', '55', '33']# 从左向右, 找到value='66' 删除一个redisLink.lrem("list1", 1, "66")print(redisLink.lrange('list1', 0, -1))# 输出结果:['77', '55', '33']# list1=['77', '55', '33']# 从右向左, 找到value='55', 删除一个redisLink.lrem('list1', -1, '55')print(redisLink.lrange('list1', 0, -1))# 输出结果:['77', '33']# list1=['77', '77', '33']# 删除name='list1'中 value='77'的所有值redisLink.lrem('list1', 0, '77')print(redisLink.lrange('list1', 0, -1))# 输出结果:print("""lpop(name) 、rpop(name):在name对应的列表的左侧/右侧获取第一个元素并在列表中移除,返回值则是第一个元素""")# list1 = ['77', '66', '55']result = redisLink.lpop('list1')print(result)  # 输出结果:77print(redisLink.lrange('list1', 0, -1))  # 输出结果:['66', '55']# list1 = ['66', '55']result = redisLink.rpop('list1')print(result)  # 输出结果:55print(redisLink.lrange('list1', 0, -1))  # 输出结果:['66']print("""ltrim(name, start, end):name对应的列表中移除没有在start-end索引之间的值参数:name:redis的namestart:索引的起始位置end:索引的结束位置""")# list1=['77', '66', '55', '44', '33']# 删除name='list1'中, 不包含索引0-2的valueredisLink.ltrim('list1', 0, 2)print(redisLink.lrange('list1', 0, -1))# 输出结果:['77', '66', '55']print()print("""lindex(name, index):在name对应的列表中根据索引获取列表元素""")# list1=['77', '66', '55']# 取出name='list1'中索引为1的值print(redisLink.lindex('list1', 1))  # 输出结果:66print()print("""brpoplpush(src, dst, timeout=0):从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧参数:src:取出并要移除元素的列表对应的namedst:要插入元素的列表对应的nametimeout:当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞""")# list = ['33', '22', '11']# list1 = ['77', '66', '55']# 将name='list1' 中的Value 全部插入到name='list'中redisLink.brpoplpush('list1', 'list', timeout=2)print(redisLink.lrange('list', 0, -1))# 输出结果:['77', '66', '55', '33', '22', '11']except Exception as err:print("redis连接异常: ", err)
finally:print()if redisLink is not None:print("释放资源,连接还给连接池")redisLink.close()

运行效果:


D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\ClassGrammarRedisExecutorQuery.py 

    getrange(key, start, end):
    获取子序列(根据字节获取,非字符)
    一个汉字3个字节 1个字母一个字节 每个字节8bit
    参数:
        name:redis的name
        start:起始位置(字节)
        end:结束位置(字节)
    

详情信息
goo
good


       incr(name, amount=1):
        自增name对应的值,当name不存在时,创建name=amount,存在则自增
        参数:
            name:redis的name
            amount:自增数(必须是整数)
    

26


       incrbyfloat(name, amount=1.0):
            自增name对应得值,当name不存在时,创建name=amount,存在则自增
            参数:
                name:redis的name
                amount:自然数(浮点数)
    
0.00
1

        decr(name, amout=1):
        自减name对应的值,当name不存在时,创建name=amount,存在则自增
        参数:
            name:redis的name
            amount:自减数(整数)
    
0


       append(key, value):
        再redis name对应的值后面追加内容
        参数:
            key:redis的name
            value:追加的字符串
    
拼接后的字符串为:  ['老杨laogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogaolaogao']
操作列表


        lpush(name, values):
        从左边新增加,不存在就新建
    
['33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11']

       rpush(name, values):
       从右边新增加,不存在就新建
    
['33', '44', '33', '44', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '55', '44']

      llen(name):
      获取列表长度
    
36

       lpushx(name, value):
       往已经有的name的列表的左边添加元素,没有的话无法创建
    
[]

      rpushx(name, value):
      往已经有的name的列表的右边添加元素,没有的话无法创建
    
[]

       linsert(name, where, refvalue, value):
        在name对应的列表的某一个值前或后插入一个新值
        参数:
        name:redis的name
        where:BEFORE或AFTER
        refvalue:标杆值 (以它为基础, 前后插入新值)
        value:要插入的数据
    
['33', '44', '33', '44', '55', '44', '77', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '55', '44']

       lset(name, index, value):
        对name对应的list中的某一个索引位置重新赋值
        参数:
        name:redis的name
        index:list的索引位置
        value:要设置的新值
    
['33', '44', '33', '33', '55', '44', '77', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '55', '44']

      lrem(name, value, num):
        name对应的list中删除指定的值
        参数:
        name:redis的name
        value:要删除得值
        num:num=0,删除列表中所有的值
        num=2,从前向后,删除2个;
        num=-2, 从后向前,删除2个;
    
['33', '44', '33', '33', '55', '44', '77', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '55', '44']
['33', '44', '33', '33', '55', '44', '77', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '44']
['33', '44', '33', '33', '55', '44', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '44']

      lpop(name) 、rpop(name):
        在name对应的列表的左侧/右侧获取第一个元素并在列表中移除,返回值则是第一个元素
    
33
['44', '33', '33', '55', '44', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66', '44']
44
['44', '33', '33', '55', '44', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '55', '44', '66', '44', '66', '66']

      ltrim(name, start, end):
        name对应的列表中移除没有在start-end索引之间的值
        参数:
        name:redis的name
        start:索引的起始位置
        end:索引的结束位置
    
['44', '33', '33']


      lindex(name, index):
        在name对应的列表中根据索引获取列表元素
    
33


      brpoplpush(src, dst, timeout=0):
        从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧
        参数:
            src:取出并要移除元素的列表对应的name
            dst:要插入元素的列表对应的name
            timeout:当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞
    
['33', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11']

释放资源,连接还给连接池

Process finished with exit code 0
 

四: Python3操作Redis删除数据


import time
import redis"""Python3连接Redis删除数据
"""
pool = None
redisLink = None
try:pool = redis.ConnectionPool(host='192.168.1.111', port=6379, decode_responses=True)redisLink = redis.Redis(connection_pool=pool, encoding='UTF-8')print("""delete(*names) :根据删除redis中的任意数据类型(string、hash、list、set、有序set)""")result = redisLink.delete('hash1')  # 删除key为hash1的键值对print(result)result = redisLink.delete('name')  # 删除key为name的值对print(result)result = redisLink.delete('list1')  # 删除key为list1的值对print(result)
except Exception as err:print("redis连接异常: ", err)
finally:print()if redisLink is not None:print("释放资源,连接还给连接池")redisLink.close()

运行效果


D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\ClassGrammarRedisExecutorDelete.py 

      delete(*names) :
        根据删除redis中的任意数据类型(string、hash、list、set、有序set)
    
0
1
1

释放资源,连接还给连接池

Process finished with exit code 0
 

五: Python3操作Redis常规操作


import redis"""Python3常规操作数据
"""
pool = None
redisLink = None
try:pool = redis.ConnectionPool(host='192.168.1.111', port=6379, decode_responses=True)redisLink = redis.Redis(connection_pool=pool, encoding='UTF-8')print("""exists(name):检测redis的name是否存在,存在就是True,False 不存在""")print(redisLink.exists('hash1'))  # 输出结果:False 说明key 不存在print(redisLink.exists('set1'))  # 输出结果:True  说明key存在print(redisLink.exists('list1'))  # 输出结果:True  说明key存在print(redisLink.exists('name'))  # 输出结果:True  说明key存在print()print("""expire(name ,time) :为某个redis的某个name设置超时时间""")redisLink.lpush('list5', 11, 22)redisLink.expire('list5', time=3)print(redisLink.lrange('list5', 0, -1))# 输出结果:['22', '11']import timetime.sleep(3)print(redisLink.lrange('list5', 0, -1))# 输出结果:[]print()print("""rename(src, dst) :对redis的name重命名""")redisLink.lpush('list5', 11, 22)print(redisLink.rename('list5', 'list-5'))# 输出结果: True 说明重命名成功print("""type(name) :获取name对应值的类型""")print("""查看所有元素""")print(redisLink.hscan("hash"))print(redisLink.sscan("set"))print(redisLink.zscan("zset"))print(redisLink.getrange("string", 0, -1))print(redisLink.lrange("list", 0, -1))print(redisLink.smembers("set3"))print(redisLink.zrange("zset3", 0, -1))print(redisLink.hgetall("hash1"))
except Exception as err:print("redis连接异常: ", err)
finally:print()if redisLink is not None:print("释放资源,连接还给连接池")redisLink.close()

运行效果:


D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\ClassGrammarRedisExecutorUpdate.py 

       exists(name):
        检测redis的name是否存在,存在就是True,False 不存在
    
0
0
0
1


       expire(name ,time) :
       为某个redis的某个name设置超时时间
    
['22', '11']
[]


      rename(src, dst) :
        对redis的name重命名
    
True

      type(name) :
        获取name对应值的类型
    

       查看所有元素
    
(0, {})
(0, [])
(0, [])

['33', '33', '22', '11', '33', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11', '33', '22', '11']
set()
[]
{}

释放资源,连接还给连接池

Process finished with exit code 0
 

 六: Python3操作Redis对Set集合操作


import time
import redis"""Python3连接Redis集合Set数据操作
"""
pool = None
redisLink = None
try:pool = redis.ConnectionPool(host='192.168.1.111', port=6379, decode_responses=True)redisLink = redis.Redis(connection_pool=pool, encoding='UTF-8')print("""sadd(name, values):name对应的集合中添加元素""")# 往集合中添加元素 name='set1'redisLink.sadd('set1', 1, 2, 3, 4, 5, 6)print(redisLink.smembers('set1'))# 输出结果:set(['1', '3', '2', '5', '4', '6'])print("""scard(name):name对应集合中元素个数""")# 'set1' = set(['1', '3', '2', '5', '4', '6'])print(redisLink.scard('set1'))# 输出结果: 6print("""smembers(name):name对应的集合所有成员""")# 获取name='set1' 中的所有values值print(redisLink.smembers('set1'))# 输出结果: set(['1', '3', '2', '5', '4', '6'])print("""sscan(name, cursor=0, match=None, count=None):name对应集合所有成员(元组形式)""")print(redisLink.sscan('set1'))# 输出结果:(0L, ['1', '2', '3', '4', '5', '6'])print("""sscan_iter(name, match=None, count=None):name对应集合所有成员(迭代器的方式)""")for item in redisLink.sscan_iter('set1'):print(item)print("""sdiff(key, *args):求集合中的差集""")# name是set1、set2中values的值# set1 = set(['1', '3', '2', '5', '4', '6'])# set2 = set(['8', '5', '7', '6'])# 在集合set1中但是不在集合set2中的values值print(redisLink.sdiff('set1', 'set2'))# 输出结果:set(['1', '3', '2', '4'])# 在集合set2中但是不在集合set1中的values值print(redisLink.sdiff('set2', 'set1'))# 输出结果:set(['8', '7'])print("""sdiffstore(dest, keys, *args):将两个集合中的差集,存储到第三个集合中""")# 在集合set1但是不再集合set3中的values值, 存储到set3集合中redisLink.sdiffstore('set3', 'set1', 'set2')print(redisLink.smembers('set3'))# 输出结果:set(['1', '3', '2', '4'])print("""sinter(keys,*args):获取两个集合中的交集""")# 求集合set1与set2的交集print(redisLink.sinter('set1', 'set2'))print("""sunion(keys, *args):获取多个name对应的集合并集""")# 获取set1与set2集合中的并集print(redisLink.sunion('set1', 'set2'))# 输出结果:set(['1', '3', '2', '5', '4', '7', '6', '8'])print("""sunionstore(dest, keys, *args):将两个集合中的并集,存储到第三个集合中""")# 将set1与set2集合中的并集, 存储到set3中print(redisLink.sunionstore('set3', 'set1', 'set2'))print(redisLink.smembers('set3'))# 输出结果:set(['1', '3', '2', '5', '4', '7', '6', '8'])print("""sismember(name, value):判断是否是集合的成员""")# 校验value=3 是否在name=set1集合中print(redisLink.sismember('set1', 3))# 输出结果:True表示在集合中print(redisLink.sismember('set1', 33))# 输出结果: False表示不在集合中print("""smove(src, dst, value):将某个成员从一个集合中移动到另外一个集合""")# 目前集合set1、set2中的元素# set1=set(['1', '3', '2', '5', '4', '6'])# set2=set(['8', '5', '7', '6'])# 将set1中的value=4的元素, 移动到set2集合中redisLink.smove('set1', 'set2', 4)print(redisLink.smembers('set1'))# 输出结果:set(['1', '3', '2', '5', '6'])print(redisLink.smembers('set2'))# 输出结果:set(['8', '5', '4', '7', '6'])print("""spop(name):从集合移除一个成员, 并将其返回(集合是无序的,所有移除也是随机的)""")# 目前set1集合中元素 set1=set(['1', '3', '2', '5', '6'])# 随机删除'set1'中的Value值print(redisLink.spop('set1'))# 输出结果:1  说明删除的个数print(redisLink.smembers('set1'))# 输出结果:set(['3', '2', '5', '6'])print("""srem(name, values):在name对应的集合中删除某些值""")# 目前set1=set(['3', '2', '5', '6'])print(redisLink.srem('set1', 2))# 输出结果:1print(redisLink.smembers('set1'))# 输出结果:set(['3', '5', '6'])except Exception as err:print("redis连接异常: ", err)
finally:print()if redisLink is not None:print("释放资源,连接还给连接池")redisLink.close()

运行效果:


D:\program_file_worker\anaconda\python.exe D:\program_file_worker\python_source_work\SSO\grammar\ClassGrammarRedisExecutorSet.py 

       sadd(name, values):
        name对应的集合中添加元素
    
{'1', '4', '6', '2', '5', '3'}

       scard(name):
        name对应集合中元素个数
    
6

      smembers(name):
        name对应的集合所有成员
    
{'1', '4', '6', '2', '5', '3'}

       sscan(name, cursor=0, match=None, count=None):
        name对应集合所有成员(元组形式)
    
(0, ['1', '2', '3', '4', '5', '6'])

      sscan_iter(name, match=None, count=None):
        name对应集合所有成员(迭代器的方式)
    
1
2
3
4
5
6

      sdiff(key, *args):
        求集合中的差集
    
{'1', '6', '2', '5', '3'}
set()

       sdiffstore(dest, keys, *args):
        将两个集合中的差集,存储到第三个集合中
    
{'1', '6', '2', '5', '3'}

       sinter(keys,*args):
        获取两个集合中的交集
    
{'4'}

        sunion(keys, *args):
        获取多个name对应的集合并集
    
{'1', '4', '6', '2', '5', '3'}

      sunionstore(dest, keys, *args):
        将两个集合中的并集,存储到第三个集合中
    
6
{'1', '4', '6', '2', '5', '3'}

      sismember(name, value):
        判断是否是集合的成员
    
1
0

       smove(src, dst, value):
        将某个成员从一个集合中移动到另外一个集合
    
{'1', '6', '2', '5', '3'}
{'4'}

       spop(name):
        从集合移除一个成员, 并将其返回(集合是无序的,所有移除也是随机的)
    
1
{'5', '3', '2', '6'}

       srem(name, values):
        在name对应的集合中删除某些值
    
1
{'5', '3', '6'}

释放资源,连接还给连接池

Process finished with exit code 0
 

忙着去耍帅, 后期有时间补充完整......................

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/151318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】| Thymeleaf 模板引擎

目录 Thymeleaf 模板引擎 1. 第一个例子 2. 表达式 ①标准变量表达式 ②选择变量表达式(星号变量表达式) ③链接表达式(URL表达式) 3. Thymeleaf的属性 ①th:action ②th:method ③th:href ④th:src ⑤th:text ⑥th:…

Swift SwiftUI CoreData 过滤数据 2

预览 Code import SwiftUI import CoreDatastruct HomeSearchView: View {Environment(\.dismiss) var dismissState private var search_value ""FetchRequest(entity: Bill.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Bill.c_at, ascending: false)…

Golang 程序漏洞检测利器 govulncheck(三):github 集成方法

上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 使用的漏洞数据库(Go vulnerability database),本文详细讲解下 Github 项目如何使用 govulncheck。 govulncheck 为 Golang 开发者提供了一种准确可靠的方式来了解程序中可能存在…

Kafka 高可用

正文 一、高可用的由来 1.1 为何需要Replication 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Broker宕机,则其上所有的Partition数据都不可被消费,这与Kafka数据持久性及Delivery Guarantee的设计目标相悖。同时Pr…

MySQL增删查改(进阶1)

一、数据库约束 约束:按照一定条件进行规范的做事; 表定义的时候,某些字段保存的数据需要按照一定的约束条件; 1.null约束 字段null:该字段可以为空;not null:该字段不能为空不指定的话就是…

bigemap在林业勘测规划设计行业的一些应用

选择Bigemap的原因: 主要注重影像的时效性,软件的影像时效性比其他的更新快,更清晰。 使用场景: 1.林业督查,主要是根据国家下发的图斑,结合测绘局的影像以及bigemap的较新影像对比去年和今年的林地变化。…

Kafka实战案例

kafka系统的生成,自顶向下 1. kafaka发送消息 1.1 是最初始外部调用kafaka的地方1.6 是最初调用kafaka的函数。中间是对kafaka的构建 1.1 向Kafka发送一条发布视频的message 在videoHandler的发布视频逻辑中,向Kafka发送一条发布视频的mq&#xff0c…

【轻松玩转MacOS】常用软件篇

引言 在本篇文章中,我将介绍如何安装和使用一些常用的软件,如Safari浏览器、邮件、日历、地图等。让我们一起来看看吧! 一、Safari浏览器 Safari是MacOS自带的浏览器,具有简洁、快速、安全的特点。 以下是一些Safari浏览器的使…

Zabbix自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

vue模版语法-{{}}/v-text/v-html/v-once

一、{{}}双括号:用于文本渲染 1、 {{变量名}}:data中返回对象的变量名 2、{{js表达式}}:可以直接进行js表达式处理 3、注意:双大括号中不要写等式书写 二、v-text 指令,用于文本渲染 1、为了解决双大括号渲染数据出现闪烁问题 三、v-cloak …

Qt中的基础数据类型

1.基础类型 因为Qt是一个C++ 框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型 QT基本数据类型定义在#include <QtGlobal> 中,QT基本数据类型有: 类型名称注释备注qint8signed ch…

盒子模型的基础

盒子模型 边框&#xff08;border&#xff09; border可以设置元素的边框&#xff0c;边框分成三部分&#xff0c;边框的&#xff08;粗细&#xff09;边框的样式&#xff0c;边框的颜色 <style>div {width: 100px;height: 100px;border-width: 200;border-style: 边框…

【面试HOT100】哈希双指针滑动窗口

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于LeetCodeHot100进行的&#xff0c;每个知识点的修正和深入主要参考…

openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制

文章目录 openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制92.1 不支持的特性92.2 MOT限制92.3 不支持的DDL操作92.4 不支持的数据类型92.5 不支持的索引DDL和索引92.6 不支持的DML92.7 不支持的JIT功能&#xff08;…

自然语言处理的分类

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 作为理解、生成和处理自然语言文本的有效方法&#xff0c;自然语言处理&#xff08;NLP&#xff09;的研究近年来呈现出快速传播和广泛采用。鉴于 NLP 的快速发展&#xff0c;获得该领域的概述并对其进行维护是很困难的。…

代码随想录算法训练营第四十五天 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 视频讲解&#xff1a;动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 代码随想录 &#xff08;1&#xff09;代码 494. 目标和 视频讲解&#xff1a;动态规划…

计算机竞赛 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…

剑指offer——JZ34 二叉树中和为某一值的路径(二) 解题思路与具体代码【C++】

一、题目描述与要求 二叉树中和为某一值的路径(二)_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff0c;找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过…

Youtube视频下载工具分享-油管视频,音乐,字幕下载方法汇总

YouTube视频下载方法简介 互联网上存在很多 YouTube 下载工具&#xff0c;但我们经常会发现自己收藏的工具没过多久就会失效&#xff0c;我们为大家整理的这几种方法&#xff0c;是存在时间较久并且亲测可用的。后续如果这些工具失效或者有更好的工具&#xff0c;我们也会分享…

c++day2

1.XMIND 2. 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c;定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include &…