Python 操作 Redis

  • 连接方式:单次连接/连接池
  • 存储操作:String/Hash

连接方式:单次连接/连接池

import redisdef Once_connect():"""此种连接为单次连接,耗资源:return:设置的name值"""# 创建 Redis连接对象redis_coon = redis.Redis(host='localhost', port=6379, db=5)# 字符串类型设置单个值redis_coon.set('name', 'susu')return redis_coon.get('name').decode('utf-8')def Twice_connect():"""当程序创建数据源实例时,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中,当程序需要进行数据库访问时,无需重新新建数据库连接,而是从连接池中取出一个空闲的数据库连接:return:设置的age值"""# 创建连接池redis_pool = redis.ConnectionPool(host='localhost', port=6379, db=5)# 从连接池中挑出空闲的连接对象redis_coon = redis.Redis(connection_pool=redis_pool)# 字符串类型设置单个值redis_coon.set('age', '20')return redis_coon.get('age').decode('utf-8')print(Once_connect())  # susu
print(Twice_connect())  # 20

存储操作:String/Hash

String 类型(字符串)

# 打印字符串的二进制代码
def Print_binary(string):print("此字符串为:%s" % string)for i in string:num = ord(i)print(bin(num).replace('b', ''), end='\t')print()def String_operation():# 创建连接池及连接对象redis_pool = redis.ConnectionPool(host='localhost', port=6379, db=5)redis_coon = redis.Redis(connection_pool=redis_pool)redis_coon.flushall()"""命令1:get(name)用于获取值命令2:set(name, value, ex=None, px=None, nx=False, xx=False)ex:设置过期时间(单位:s) —— 对应setexpx:设置过期时间(单位:ms) —— 对应psetexnx:如果设置为True,则只有当name不存在时才能执行 —— 对应setnxxx:如果设置为True,则只有当name存在时才能执行"""redis_coon.set('name', 'susu', ex=60, nx=False, xx=False)redis_coon.set('age', '20', px=1000 * 60, nx=True, xx=False)redis_coon.set('sex', 'man', px=1000 * 60, nx=False, xx=False)susu_dict = {}susu_dict.setdefault('name', redis_coon.get('name').decode('utf-8'))susu_dict.setdefault('age', redis_coon.get('age').decode('utf-8'))susu_dict.setdefault('sex', redis_coon.get('sex').decode('utf-8'))print(susu_dict)  # {'name': 'susu', 'age': '20', 'sex': 'man'}"""命令3:setex(name, time, value)time 过期时间单位为秒命令4:psetex(name, time_ms, value)time_ms 过期时间单位为毫秒"""fruit_dict = {}redis_coon.setex('red', 60, 'apple')redis_coon.psetex('yellow', 60 * 1000, 'banana')redis_coon.psetex('green', 60 * 1000, 'cucumber')fruit_dict.setdefault('red', redis_coon.get('red').decode('utf-8'))fruit_dict.setdefault('yellow', redis_coon.get('yellow').decode('utf-8'))fruit_dict.setdefault('green', redis_coon.get('green').decode('utf-8'))print(fruit_dict)  # {'red': 'apple', 'yellow': 'banana', 'green': 'cucumber'}"""命令5:setnx(name, value)只有当name不存在时才执行命令6:mset(*args, **kwargs)以关键字形式传递参数or 传入字典 —— {'name': 'nana', 'age': 20, 'sex': 'woman'}命令7:mget(*args, **kwargs)以传入字符串形式获取值(返回值是一个列表) —— 获取的是二进制格式(需要利用.decode()进行转换)"""redis_coon.setnx('sweet', 'milk')nana_dict = {'name': 'nana', 'age': 20, 'sex': 'woman'}redis_coon.mset(nana_dict)name, age, sex, sweet = redis_coon.mget('name', 'age', 'sex', 'sweet')new_nana_dict = {'name': name.decode(), 'age': age.decode(), 'sex': sex.decode(), 'like': sweet.decode()}print(new_nana_dict)  # {'name': 'nana', 'age': '20', 'sex': 'woman', 'like': 'milk'}"""命令8:getset(name, value)设置新值并获取原来的值 —— 返回值为value要求:此name已存在命令9:setrange(name, offset, value)name:需要替换的字符串offset:索引起始value:新的子字符串命令10:getrange(key, start, end)key:需要获取的字符串start:索引起始end:索引结束"""print(redis_coon.getset('sweet', 'coffee').decode())redis_coon.setrange('sweet', 1, 'at is a animal.')print(redis_coon.get('sweet').decode())  # cat is a animal.print(redis_coon.getrange('sweet', 0, 1).decode())  # ca"""命令11:strlen(name)返回字符串的长度命令12:incr(self, name, amount=1)对符合要求的字符串(整数)进行递增amount的操作命令13:incrby(self, name, amount=1)对符合要求的字符串(整数)进行递增amount的操作命令14:incrbyfloat(self, name, amount=1.0)对符合要求的字符串(数字)进行递增amount的操作命令15:decr(self, name, amount=1)对符合要求的字符串(整数)进行递减amount的操作命令16:decrby(self, name, amount=1)对符合要求的字符串(整数)进行递减amount的操作"""print(susu_dict)print(redis_coon.strlen('name'))  # 4redis_coon.incr('age')redis_coon.incrby('age')print(redis_coon.get('age').decode())  # 22redis_coon.incrbyfloat('age', amount=2.5)print(redis_coon.get('age').decode())  # 24.5redis_coon.incrbyfloat('age', amount=2.5)print(redis_coon.get('age').decode())  # 27redis_coon.decr('age')redis_coon.decrby('age')print(redis_coon.get('age').decode())  # 25"""命令17:append(key, value)在指定字符串key后面追加字符串命令18:setbit(name, offset, value)要求:先将字符串换算为二进制代码!name:需要执行操作的字符串offset:索引项value:替换项(0/1)命令19:getbit(name, offset)用途:获取字符串二进制代码指定位的0/1值name:需要执行操作的字符串offset:索引项命令20:bitcount(key, start=None, end=None)用途:计算字符串索引区间1值的总数key:需要执行操作的字符串start:起始索引end:结束索引"""redis_coon.append('red', ' is red')print(redis_coon.get('red').decode())  # apple is redPrint_binary(redis_coon.get('yellow').decode())redis_coon.setbit('yellow', 7, 1)Print_binary(redis_coon.get('yellow').decode())print(redis_coon.getbit('yellow', 0))  # 0print(redis_coon.bitcount('yellow', 0, -1))  # 23String_operation()

Hash 类型(哈希)

# 将二进制字典or列表转换成对应的字典or列表
def Iterate_ListOrDict(value):if isinstance(value, list):list_latest = []for i in value:list_latest.append(i.decode())return list_latestelif isinstance(value, dict):dict_latest = {}for i in value:dict_latest.setdefault(i.decode(), value[i].decode())return dict_latest# 将哈希方法scan_iter和scan得到的二进制元组转换成字典打印
def Iterate_Tuple_To_Dict(value):dict_latest = {}for item in value:dict_latest.setdefault(item[0].decode(), item[1].decode())return dict_latestdef Hash_operation():# 创建连接池及连接对象redis_pool = redis.ConnectionPool(host='localhost', port=6379, db=5)redis_coon = redis.Redis(connection_pool=redis_pool)redis_coon.flushall()"""如下命令中的name代表一个哈希表命令1:hset(name, key, value)key:哈希表中对应的键value:哈希表中对应的值命令2:hmset(name, mapping)重点:新版本的hmset不被维护!(此处也是)mapping:字典命令3:hget(name,key)key:哈希表中对应的键值命令4:hmget(name, keys, *args)keys:以字符串的形式传入多个键值return:返回值为一个二进制列表命令5:hgetall(name) 返回值为一个二进制字典"""redis_coon.hset('myhash', 'name', 'susu')redis_coon.hset('myhash', 'age', 20)redis_coon.hset('myhash', 'sex', 'man')print(redis_coon.hget('myhash', 'age').decode())  # 20name, sex = redis_coon.hmget('myhash', 'name', 'sex')susu_dict = {'name': name.decode(), 'age': 20, 'sex': sex.decode()}print(susu_dict)  # {'name': 'susu', 'age': 20, 'sex': 'man'}print(Iterate_ListOrDict(redis_coon.hgetall('myhash')))  # {'name': 'susu', 'age': '20', 'sex': 'man'}"""命令6:hlen(name)获取哈希表中共有键值对的总数命令7:hkeys(name)获取哈希表中所有的键,返回值是一个列表命令8:hvals(name)获取哈希表中所有的值,返回值是一个列表命令9:hexists(name, key)判断某键是否存在于哈希表,返回值是布尔值命令10:hdel(name,*keys)删除哈希表中相对应的键值对"""print(redis_coon.hlen('myhash'))  # 3print(Iterate_ListOrDict(redis_coon.hkeys('myhash')))  # ['name', 'age', 'sex']print(Iterate_ListOrDict(redis_coon.hvals('myhash')))  # ['susu', '20', 'man']print(redis_coon.hexists('myhash', '1'))  # Falseredis_coon.hdel('myhash', 'name', 'sex')print(Iterate_ListOrDict(redis_coon.hgetall('myhash')))  # {'age': '20'}"""命令11:hincrby(name, key, amount=1)指定哈希表中的键对应的值(整数)自增amount命令12:hincrbyfloat(name, key, amount=1.0)指定哈希表中的键对应的值(数字)自增amount"""redis_coon.hincrby('myhash', 'age')print(redis_coon.hget('myhash', 'age').decode())  # 21redis_coon.hincrbyfloat('myhash', 'age', amount=2.5)print(redis_coon.hget('myhash', 'age').decode())  # 23.5"""           命令13:hscan_iter(name, match=None, count=None)此方法利用yield封装成为一个生成器(可以被迭代)从中迭代取到的数据类型为元组命令14:hscan(name, cursor=0, match=None, count=None)cursor:查询游标(返回值为0时代表查询结束)返回值是一个元组(第一个参数是游标值/第二个是查询到的字典类型的数据)"""redis_coon.hset('myhash', 'name', 'susu')redis_coon.hset('myhash', 'sex', 'man')print(Iterate_Tuple_To_Dict(redis_coon.hscan_iter('myhash')))  # {'age': '23.5', 'name': 'susu', 'sex': 'man'}print(Iterate_ListOrDict(redis_coon.hscan('myhash', cursor=0)[1]))  # {'age': '23.5', 'name': 'susu', 'sex': 'man'}Hash_operation()

Redis 总结 —— 2022/2/4相关推荐

  1. Redis 总结 —— 2022/2/6

    Python 操作 Redis 存储操作:Set/Sorted Set 存储操作:Set/Sorted Set Set 类型(无序集合) # 将二进制集合转换对应的集合 def Iterate_Set ...

  2. Redis【2022最新面试题】

    文章目录 概述 什么是Redis Redis有哪些优缺点 为什么要用 Redis /为什么要用缓存 为什么要用 Redis 而不用 map/guava 做缓存? Redis为什么这么快 数据类型 Re ...

  3. 什么是java代理?

    什么是java代理?关于这个问题我已经回答过很多次,但许多朋友可能还没有理解,本篇文章再来详细为大家解答一下什么是java代理?等相关问题,希望对大家有所帮助. 什么是java代理? 什么是代理呢,其 ...

  4. 程序员常说的外包公司到底是什么?

    程序员工作的企业有好几种类型,比如说互联网企业,传统企业,还有外包公司,这几种类型的企业不论是工作性质还是福利待遇都有差异.都说外包公司不好,今天就来说说什么是外包公司. 外包公司到底是什么? 为了更 ...

  5. 学完Java可以做什么兼职?去哪里找兼职?

    最近有些同学表示我感觉自己Java可学的差不多了,想要找一些兼职一方面锻炼自己,一方面还能赚点外快,那么学Java的到底应该怎么做兼职呢?本篇来解答一下这个问题. 学完Java可以做什么兼职? 能做的 ...

  6. Java就业方向有哪些?学习Java开发能做什么?

    学习Java开发都能做什么?Java主要应用在B/S和C/S领域.由于科技的不断发展,B/S将不足以满足社会需求,C/S将会是社会发展趋势.随着Servlet技术的使用,Java向Web移动设备方向挺 ...

  7. 二方外包和三方外包是什么?

    程序员们有时候会听到招聘人员说自己是二方外包,或者直接说自己不是外包,只是合同签署公司有所差别,和正式员工没有什么区别.抛开那种没底线的欺骗行为,到底什么是二方外包呢?它与三方外包的差别是什么?今天来 ...

  8. java怎么读取数据?

    Java属于入门容易,天花板却极高的编程语言.java怎么读取数据?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了java怎么读取数据?等相关问题 ...

  9. 什么是java单例模式?

    关于java单例模式的文章早已是非常多了,本文是对我个人过往学习java,理解及应用java单例模式的一个总结.此文内容涉及java单例模式的基本概念,以及什单例模式的优缺点,希望对大家有所帮助. 什 ...

最新文章

  1. 基于i.MX RT1060的可编程视觉模块
  2. jQuery最佳实践
  3. webplugin 没有画面_[问题记录] webpack devServer HtmlWebpackPlugin 没有加载 js、css
  4. python计算数组元素的和_python中数组的运算
  5. Windows高级编程学习笔记(一)
  6. key value vue 输出_Vue2.0 v-for 中 :key 到底有什么用?
  7. 【Elasticsearch】 Elasticsearch 多字段查询 best_fields、most_fields、cross_fields,傻傻分不清楚?
  8. 他人笑我太疯癫 我笑他人看不穿
  9. HackerOne 平台诞生首个收入超200万美元的赏金猎人
  10. CentOS 7安装zabbix 4.4(资源)
  11. 【服务器】Discuz论坛实现微信小程序(修改接口)
  12. 【干货】--手把手教你完成文本情感分类
  13. mysql limti_MYSQL分页 limint
  14. xftp传输文件报错
  15. 阿特拉斯拧紧枪说明书_阿特拉斯使用说明书(全).pdf
  16. Financial knowledge
  17. CBA离好生意还差几个NBA?
  18. python制作qq登录界面_使用Python编写一个QQ办公版的图形登录界面
  19. 虚拟机网络模式(NAT模式)
  20. 深入理解latch: cache buffers chains

热门文章

  1. 使用拦截器防止表单重复提交
  2. 删除用户 userdel
  3. 大数据工程师入职京东年薪37w(附:面试真题分享)
  4. LaTeX学习 |(6)LaTeX中的特殊字符
  5. 莫纳什大学计算机专业录取要求,2020年莫纳什大学计算机信息硕士申请条件
  6. Preparatory Class-Day8------函数
  7. marvin java_java-与MarvinFramework比较图像
  8. 请问投稿中要求上传的author_投稿须知Author lnstruction 解读(中)
  9. Redis数据库及五种数据类型的常用命令详解
  10. 跨境电商如何做好引流?做亚马逊速卖通独立站的看过来