python操作redis缓存-字符串类型

首先要安装redis-py模块

python连接redis方式,有两种连接方式,一种是直接连接,一张是通过连接池连接

注意:以后我们都用的连接池方式连接,直接连接不推荐

1、直接连接方式:【不推荐】

Redis()配置连接信息

set()写入数据

get()读取数据

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

r= redis.Redis(host='127.0.0.1', port=6379) #配置连接信息

r.set('foo', 'asdvc344') #写入数据

hc = r.get('foo') #读取数据

print(hc)

2、连接池连接方式【推荐】

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

ConnectionPool()配置连接池连接信息

Redis()连接连接池

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('foo', 'Bar1111111111') #写入数据

r.get('foo') #获取数据

字符串数据类型操作

String字符串类型操作,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操作才执行,用于修改

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('foo', 'Bar',ex=20) #写入数据

hc = r.get('foo') #获取数据

print(hc)

setnx(name, value)只有name不存在时,执行设置操作(添加)

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.setnx('foo', 'Bar22') #写入数据setnx(name, value)只有name不存在时,执行设置操作(添加)

hc = r.get('foo') #获取数据

print(hc)

setex(name, value, time)设置值,参数:time,过期时间(数字秒 或 timedelta对象)

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.setex('foo', 'Bar22',5) #setex(name, value, time)设置值,参数:time,过期时间(数字秒 或 timedelta对象)

hc = r.get('foo') #获取数据

print(hc)

psetex(name, time_ms, value)设置值,参数:time_ms,过期时间(数字毫秒 或 timedelta对象)

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.psetex('foo',5, 'Bar22') #psetex(name, time_ms, value)设置值,参数:time_ms,过期时间(数字毫秒 或 timedelta对象)

hc = r.get('foo') #获取数据

print(hc)

mset(*args, **kwargs)批量设置

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.mset(k1='v1', k2='v2') #mset(*args, **kwargs)批量设置#或者

r.mset({'k3': 'v1', 'k4': 'v2'})

mget(keys, *args)批量获取

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.mset(k1='v1', k2='v2') #mset(*args, **kwargs)批量设置#或者

r.mset({'k3': 'v3', 'k4': 'v4'})#mget(keys, *args)批量获取

a = r.mget('k1', 'k2')#或者

b = r.mget(['k3', 'k4'])print(a,b)#返回:[b'v1', b'v2'] [b'v3', b'v4']

getset(name, value)设置新值并获取原来的值

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','v1') #添加

a = r.get('k1') #获取

print(a)#getset(name, value)设置新值并获取原来的值

b = r.getset('k1','v222')print(b)

getrange(name, start, end)获取指定名称的字符串里指定范围的字符

name,要获取的名称

start,要获取的字符串起始位置(字节)

end要获取的字符串结束位置(字节)

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','afadfnanr') #添加

a = r.getrange('k1',2,5) #getrange(name, start, end)获取指定名称的字符串里指定范围的字符

print(a)#返回:adfn

setrange(name, offset, value)从指定字符串索引开始向后替换(新值太长时,则向后添加)

offset,字符串的索引,字节(一个汉字三个字节)

value,要设置的值

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','afadfnanr') #添加

r.setrange('k1',2,'111') #setrange(name, offset, value)从指定字符串索引开始向后替换(新值太长时,则向后添加)

a = r.get('k1')print(a)#返回:af111nanr

setbit('name', 7, 1),将指定名称里的内容转换成0和1表示的二进制,在从二进制指定的位置替换成指定的值,要替换的值只能是0或者1

字符串转换成二进制

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','foo') #添加

a = r.get('k1') #获取内容

print(a) #得到字节类型

c= str(a,encoding='utf-8') #将字节转换成字符串

print(c) #得到字符串类型

for i in c: #循环字符串

num = ord(i) #将循环到的字符串,转换成十进制

print(bin(num).replace('b', '')) #将十进制转换成二进制,返回的二进制里有个b,表示二进制的意思,将b替换成空

#那么字符串,foo,的二进制表示就是01100110 01101111 01101111

r.setbit('k1',7,1) #setbit('name', 7, 1),将指定名称里的内容转换成0和1表示的二进制,在从二进制指定的位置替换成指定的值,要替换的值只能是0或者1

e = r.get('k1')print(e)

f= str(e,encoding='utf-8')print(f)for i inf:

num=ord(i)print(bin(num).replace('b', ''))#转换过程#b'foo'#foo#01100110#01101111#01101111#b'goo'#goo#01100111#01101111#01101111

#原始数据:foo 二进制表示:01100110 01101111 01101111#通过setbit('k1',7,1):用1替换了二进制表示的第7个位置#替换后变成:goo 二进制表示:01100111 01101111 01101111

getbit(name, offset)将指定名称的内容,转换成0和1表示的二进制,获取二进制里指定位置的二进制表示

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','foo') #添加

a = r.getbit('k1',7) #将指定名称的内容,转换成0和1表示的二进制,获取二进制里指定位置的二进制表示

print(a)

bitcount(name, start, end)将指定名称的内容,转换成二进制位表示,然后计算出1表示的个数

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','foo') #添加

a = r.bitcount('k1',0,7) #将指定名称的内容,转换成0和1表示的二进制,获取二进制里指定位置的二进制表示

print(a) #bitcount(name, start, end)将指定名称的内容,转换成二进制位表示,然后计算出1表示的个数#返回:16

#二进制表示#01100110#01101111#01101111

bitop(operation, dest, *keys)获取Redis中n1,n2,n3对应的值,然后将所有的值做二进制位运算(求并集),然后将结果保存 new_name 对应的值中

operation,AND(并) 、 OR(或) 、 NOT(非) 、 XOR(异或)

dest, 新的Redis的name

*keys,要查找的Redis的name

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','234') #添加

r.set('k2','567') #添加

r.set('k3','89') #添加

r.bitop("AND", 'new_name', 'k1', 'k2', 'k3') #bitop(operation, dest, *keys)获取Redis中n1,n2,n3对应的值,然后将所有的值做二进制位运算(求并集),然后将结果保存 new_name 对应的值中

d= r.get('new_name')print(d)

strlen(name)返回name对应值的字节长度(一个汉字3个字节)

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','林贵秀') #添加

d= r.strlen('k1') #strlen(name)返回name对应值的字节长度(一个汉字3个字节)

print(d)#返回9

incr(self, name, amount=1)必须整数自增,自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','1') #添加

d= r.incr('k1',amount=1) #incr(self, name, amount=1)整数自增,自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

print(d)

incrbyfloat(self, name, amount=1.0)浮点数自增,整数自增负数自减 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','2') #添加

d= r.incrbyfloat('k1',amount=1.5) #incrbyfloat(self, name, amount=1.0)浮点数自增,整数自增负数自减 name对应的值,当name不存在时,则创建name=amount,否则,则自增。

print(d)#返回:3.5

decr(self, name, amount=1)整数自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','2') #添加

d= r.decr('k1',amount=1) #decr(self, name, amount=1)整数自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。

print(d)#返回:1

append(name, value)在redis name对应的值后面追加内容

#!/usr/bin/env python#-*- coding:utf-8 -*-

import redis #导入操作redis模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

r.set('k1','2') #添加

r.append('k1','22') #append(name, value)在redis name对应的值后面追加内容

d= r.get('k1')print(d)#返回:222

利用字符串方式缓存网页应用

Tornado框架

write()方法:web.py文件里的write()方法,接收字符串显示给用户

使用的Tornado框架,但是Tornado框架在将html转换成字符串显示给用户后,就删除了,所以我们需要修改一下源码,添加一个字段保存一下html字符串接,在web.py文件里的write()方法里修改源码,添加一个字段self._response_html = chunk  保存html文件转换的字符串,这样我们方便得到html转换的字符串

在web.py文件里的write()方法里修改源码

封装一个缓存处理模块

#!/usr/bin/env python#coding:utf-8

import redis #导入操作redis缓存模块

pool= redis.ConnectionPool(host='127.0.0.1', port=6379) #配置连接池连接信息

r= redis.Redis(connection_pool=pool) #连接连接池

classhuancuen:"""处理缓存对象"""

def __init__(self,_self,name):"""self._self 接收创建对象时传进来的对象

self.name 接收创建对象时传进来的缓存名称

self.shi_jian 设置缓存有效时间,(秒)"""self._self=_self

self.name=name

self.shi_jian= 10

defhc_get(self):"""hc_get()方法:无参,返回缓存内容

根据创建对象时传进来的缓存名称,到缓存里获取到对应名称的缓存

判断此缓存如果存在,就读取缓存显示给用户"""html=r.get(self.name)ifhtml:

self._self.write(html)returnhtmldefhc_set(self):"""r.set()方法:无参,无返回

获取到用户请求的html字符串,将htnl字符串作为值,创建对象时传入的缓存名称作为名称,写入缓存

缓存有效时间,是对象里的self.shi_jian字段值"""r.set(self.name,self._self._response_html,ex=self.shi_jian)

逻辑处理调用

#!/usr/bin/env python#coding:utf-8

importtornado.ioloopimport tornado.web #导入tornado模块下的web文件

importtimeimporthuanc#逻辑处理

class MainHandler(tornado.web.RequestHandler): #定义一个类,继承tornado.web下的RequestHandler类

def get(self): #get()方法,接收get方式请求

shjan =time.time()

hc= huanc.huancuen(self,'index') #创建缓存对象

if hc.hc_get(): #获取缓存展现给用户,会返回一个htnl字符串,判断字符串存在说明缓存存在

return #返回不执行下面代码

self.render("index.html",shjan = shjan) #显示cshi.html文件,将shjan变量传到模板语言里渲染

hc.hc_set() #将html字符串写入缓存

self.write()classDluHandler(tornado.web.RequestHandler):def get(self, *args, **kwargs):

shjan=time.time()

hc= huanc.huancuen(self,'dlu')ifhc.hc_get():returnself.render("dlu.html", shjan=shjan)

hc.hc_set()

settings= { #html文件归类配置,设置一个字典

"template_path":"views", #键为template_path固定的,值为要存放HTML的文件夹名称

"static_path":"static", #键为static_path固定的,值为要存放js和css的文件夹名称

}#路由映射

application = tornado.web.Application([ #创建一个变量等于tornado.web下的Application方法

(r"/index", MainHandler), #判断用户请求路径后缀是否匹配字符串index,如果匹配执行MainHandler方法

(r"/dlu", DluHandler),

],**settings) #将html文件归类配置字典,写在路由映射的第二个参数里

if __name__ == "__main__":#内部socket运行起来

application.listen(8888) #设置端口

tornado.ioloop.IOLoop.instance().start()

python redis缓存_第二百九十五节,python操作redis缓存-字符串类型相关推荐

  1. 第二百九十四节,Redis缓存-Redis安装

    redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...

  2. python各个解释器的用途-常用的五种Python解释器|老男孩网络Python学习课程

    Python是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的五种Python解释 ...

  3. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  4. agent python实现 建模_零基础三天学会Python爬虫(第二天)

    一.Python与urllib2 现在已经迫不及待的想尝试一下url和网络爬虫的配合关系了.我们上一届已经介绍过了,爬虫就是把URL地址中的网络资源读取出来,然后处理(保存到本地,或者打印等等).本篇 ...

  5. python 面试问题_值得阅读的30个Python面试问题

    python 面试问题 Interview questions are quite tricky to predict. In most cases, even peoples with great ...

  6. python 字节流分段_一文掌握CTF中Python全部考点

    声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术.思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担! 前 言 一次偶然的机会,让自己 ...

  7. python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法

    大家知道,PyCharm是一款著名的Python IDE开发工具,是拥有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,具备基本的调试.语法高亮.Project管理.代码跳转.智能提示 ...

  8. python 路径格式化_吐血整理!140种Python标准库、第三方库和外部工具都有了!...

    导读: Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据 ...

  9. python就业发展前景_如何参与蓬勃发展的Python就业市场

    python就业发展前景 From finance to artificial intelligence, data science to web development, there isn't a ...

最新文章

  1. java swing 链接_JAVA中Jtable标签设置超级链接:基于Java Swing的超链接标签和超链接按钮的实现...
  2. Exchange服务器系列课程之六--维护邮件服务器(一)
  3. Adaptive Execution让Spark SQL更高效更好用
  4. PMP-【第14章 五大过程组的工作要点】2021-2-17(292页-303页)
  5. hibernate、struts、spring mvc的作用
  6. 解锁Android性能优化的五大误区!满满干货指导
  7. java中对list监听_java – Guava:为ListenableFuture回调和监听器设置默认的Executor
  8. WIN7部分程序中文乱码的简单解决方法
  9. dataframe 如何增加新的索引_带你领略pandas中多表之间如何处理
  10. eclipse新建maven项目和聚合项目
  11. css3的新属性 新增的颜色--- 透明度---两种渐变---定义多张背景图--background-size...
  12. 程序员需要掌握哪些软技能?
  13. Citrix XenAPP域迁移操作步骤
  14. web安全详解(渗透测试基础)
  15. ssm校园在线点餐系统源码(含数据库)
  16. 计算机基础知识第三章答案,2011年河北省职称计算机模拟习题(基础知识第三章+标准答案)...
  17. WPF 制作带TreeView的ComBox
  18. 优麒麟桌面闪烁_UKUI 桌面环境登陆 Arch Linux!
  19. 小程序ios页面数据空白问题
  20. 使用EasyExcel的坑

热门文章

  1. 2023啦 最新无人直播小白教程!
  2. nodejs+vue微信小程序的饭店外卖点餐平台系统
  3. 〖2023·新星计划·第四季〗开启,Python赛道火爆预热中~ 欢迎小伙伴们报名~
  4. axios的一封装和二次封装
  5. 华为路由器Talent服务配置
  6. 云南马铃薯种薯质量追溯系统
  7. USB-HDD和USB-ZIP制作U盘启动盘有什么区别?
  8. 2019 秦皇岛CCPC赛后总结
  9. 构思编辑器教你如何不用代码排版出好看的微信公众号文章
  10. 荣耀手机装联通卡显示无服务器,荣耀X10用不了物联网卡(联通物联卡3g却不能上网)...