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,'') #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 in f:
num = ord(i)
print(bin(num).replace('b', '')) #转换过程
# b'foo'
# foo
#
#
#
# b'goo'
# goo
#
#
# #原始数据: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 #二进制表示
#
#
#

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','') #添加
r.set('k2','') #添加
r.set('k3','') #添加 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','') #添加 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','') #添加 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','') #添加 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','') #添加 r.append('k1','') #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) #连接连接池 class huancuen:
"""
处理缓存对象
"""
def __init__(self,_self,name):
"""
self._self 接收创建对象时传进来的对象
self.name 接收创建对象时传进来的缓存名称
self.shi_jian 设置缓存有效时间,(秒)
"""
self._self = _self
self.name = name
self.shi_jian = 10 def hc_get(self):
"""
hc_get()方法:无参,返回缓存内容
根据创建对象时传进来的缓存名称,到缓存里获取到对应名称的缓存
判断此缓存如果存在,就读取缓存显示给用户
"""
html = r.get(self.name)
if html:
self._self.write(html)
return html def hc_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 import tornado.ioloop
import tornado.web #导入tornado模块下的web文件
import time
import huanc #逻辑处理
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() class DluHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
shjan = time.time() hc = huanc.huancuen(self,'dlu')
if hc.hc_get():
return
self.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缓存-字符串类型的更多相关文章

  1. 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表

    python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...

  2. 第二百九十七节,python操作redis缓存-List类型,可以理解为列表

    python操作redis缓存-List类型,可以理解为列表,是可以有重复元素的列表 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush(name ...

  3. 第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型

    第二百九十六节,python操作redis缓存-Hash哈希类型,可以理解为字典类型 Hash操作,redis中Hash在内存中的存储格式如下图: hset(name, key, value)name ...

  4. 第二百九十九节,python操作redis缓存-SortSet有序集合类型,可以理解为有序列表

    python操作redis缓存-SortSet有序集合类型,可以理解为有序列表 有序集合,在集合的基础上,为每元素排序:元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值, ...

  5. 第三百零一节,python操作redis缓存-管道、发布订阅

    python操作redis缓存-管道.发布订阅 一.管道 redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pi ...

  6. 第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框

    第三百九十五节,Django+Xadmin打造上线标准的在线教育平台—Xadmin集成富文本框 首先安装DjangoUeditor3模块 Ueditor HTML编辑器是百度开源的HTML编辑器 下载 ...

  7. 五、Python操作redis

    五.Python操作redis 一.python对redis基本操作 (1)连接redis # 方式1 import redis r = redis.Redis(host='127.0.0.1', p ...

  8. python操作Redis缓存

    python操作Redis缓存 https://www.cnblogs.com/guotianbao/p/8683037.html 学习资料:电子书资源 联系邮箱:gmu1592618@gmail.c ...

  9. 第三百节,python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型

    python操作redis缓存-其他常用操作,用于操作redis里的数据name,不论什么数据类型 delete(*names)根据删除redis中的任意数据类型 #!/usr/bin/env pyt ...

随机推荐

  1. Python endswith() 方法

    描述 endswith() 方法用于判断字符串是否以指定后缀结尾,如果是则返回 True,否则返回 False. 语法 endswith() 方法语法: S.endswith(suffix[,star ...

  2. Oracle免费版和付费版,各版本的说明

    Oracle免费版和付费版的区别:   首先这里给出一个答案,oracle确实是免费的给学习的人员使用.oracle的策略就是你可以随意下载我的产品,包括oracle,weblogic等产品用于学习, ...

  3. Hive查看table在HDFS上的存储路径

    hive>show databases;hive>use databasename;hive>show create table tablename; --查看table的存储路径h ...

  4. vue中如何实现数据的双向绑定

    vue中如何实现数据的双向绑定 实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变) 由于直接写obj.name = this ...

  5. HDU 3435 A new Graph Game(最小费用最大流)&HDU 3488

    A new Graph Game Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. JMeter学习笔记(六)-负载与监听

    1. 场景设计 场景设计的原则:忠于用户实际操作,组合用户的各种操作到场景中来. JMeter场景主要通过线程组设置来完成的,对于复杂场景还需要与逻辑控制器配合完成. 2.场景设置 JMeter线程组 ...

  7. git 从远程git服务上拉代码 git服务器非默认端口

    从服务器上拉代码有如下报错: fatal: Not a git repository (or any of the parent directories): .git 初始代本地版本库: [root@ ...

  8. sudo apt-get update 时出现的hit、ign、get的含义

    hit,命中表示链接上这个网站 get获取表示有更新并且下载, ign忽略表示无更新或者更新无关紧要或者不需要,譬如某些插件系统已经有了或者语言翻译包

  9. Oracle PLSQL Demo - 04.数字FOR LOOP循环[NUMBERABLE (FOR) LOOP]

    declare v_display ); begin .. loop .. loop dbms_output.put_line(i || ' - ' || j); end loop; end loop ...

  10. 关于Snmp的Trap代码开发之坑

    最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到 ...