python之redis

前言:本来想写redis与rabbitMQ的,但写完redis后感觉有点多,rabbitMQ还是留在下篇博客吧~~

关于redis与rabbitMQ的下载与安装,可参考redis&rabbitMQ安装

一、redis基本操作-1

 1 import redis
 2 #建立连接
 3 r=redis.Redis(host="127.0.0.1",port=6379)
 4
 5 all_keys=r.keys()#输出所有key,列表[b‘age‘,b‘name‘,b‘occupation‘]
 6 for k in all_keys:
 7     print(k,r.get(k))
 8
 9 print(r.keys())
10
11 r.set("sister","yongli",ex=5)     #存入缓存,5秒后清除
12
13 print(r.get("sister"))
14
15 r.set("father","jingxian",nx=True)    #只有father不存在时,当前set操作才执行
16 print(r.get("father"))
17
18 r.set("AA","BB",xx=True)           #只有AA存在时,当前set操作才执行
19 print(r.get("AA"))
20
21
22 r.mset(k1="v1",k2="v2")        #批量设置值
23 print(r.mget("k1","k2"))     #批量获取值
24
25
26 r.set("id","3114007487")
27 print(r.getrange("id",3,6))      #获取子序列(切片,0开始)
28
29 r.setrange("id",3,"AAA")       #修改字符串内容,从指定字符串索引开始向后替换
30 print(r.getrange("id",0,-1))   #输出:b‘311AAA7487‘
31
32 #"3" 对应ASCII码为51, 二进制为 0011 0011
33 print(r.getbit("id",7))
34 r.setbit("id",7,0)      #将第7位改为0,第0位开始算 0011 0010 : 50 对应为2
35 print(r.getbit("id",7))
36 print(r.getbit("id",1000))  #读取位数超过,不爆错
37 print(r.get("id"))

运行结果:

 1 b‘age‘ b‘22‘
 2 b‘id‘ b‘211AAA7487‘
 3 b‘k2‘ b‘v2‘
 4 b‘k1‘ b‘v1‘
 5 b‘name‘ b‘abc‘
 6 b‘occupation‘ b‘student‘
 7 b‘father‘ b‘BB‘
 8 [b‘age‘, b‘id‘, b‘k2‘, b‘k1‘, b‘name‘, b‘occupation‘, b‘father‘]
 9 b‘yongli‘
10 b‘BB‘
11 None
12 [b‘v1‘, b‘v2‘]
13 b‘4007‘
14 b‘311AAA7487‘
15 1
16 0
17 0
18 b‘211AAA7487‘

redis基本操作-2(供拓展)

getbit(name, offset)
1    # 获取name对应的值的二进制表示中的某位的值 (0或1)

bitcount(key, start=None, end=None)
1    # 获取name对应的值的二进制表示中 1 的个数
2    # 参数:
3        # key,Redis的name
4        # start,位起始位置
5        # end,位结束位置

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

incr(self, name, amount=1)  可用于计算PV
1    # 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
2
3    # 参数:
4        # name,Redis的name
5        # amount,自增数(必须是整数)
6

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

decr(self, name, amount=1)
1    # 自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
2
3    # 参数:
4        # name,Redis的name
5        # amount,自减数(整数)

append(key, value)  返回字符的长度
1    # 在redis name对应的值后面追加内容
2
3    # 参数:
4        key, redis的name
5        value, 要追加的字符串

上面是redis的基本操作,建议一句句实验下。

redis是一种no-sql缓存数据库。数据是存在缓存中的。所以你如果重启redis-server,会发现之前存的数据都消失了! 为了解决这个问题,可在存数据后加上save命令, 数据便会存到磁盘,重启后数据不会消失。

二、连接池与计算网站UV实例

1. 连接池

使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。

1 import redis
2  
3 pool = redis.ConnectionPool(host=‘10.211.55.4‘, port=6379)
4 r = redis.Redis(connection_pool=pool)

2.计算网站UV实例

关于PV,UV,IP可以看看我下面的总结,具体也可以参考博客:http://playkid.blog.163.com/blog/static/56287260201361951919690/

PV(page view)即页面浏览量或点击量,是衡量一个网站或网页用户访问量。具体的说,PV值就是所有访问者在24小时(0点到24点)内看了某个网站多少个页面或某个网页多少次。PV是指页面刷新的次数,每一次页面刷新,就算做一次PV流量。

UV(unique visitor)即独立访客数,指访问某个站点或点击某个网页的不同IP地址的人数。在同一天内,UV只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。

IP可以理解为独立IP的访问用户,指1天内使用不同IP地址的用户访问网站的数量,同一IP无论访问了几个页面,独立IP数均为1。

setbit巨流弊的应用场景,想想什么情况下会用到这个功能呢?超大型的应用平台,比如新浪微博,我想查看当前正在登陆的用户,如何实现?当然你会想到,用户登陆后在数据库上的用户信息上做个标记,然后count去统计做标记的用户一共有多少,so,当前用户查看迎刃而解;OK,好好,首先每个用户登录都要设置标记,如果当前用户几个亿,那么得存几个亿的标记位,超级占用库的开销;现在就有一个无敌高效的办法,利用二进制位统计当前在线用户,什么意思呢?看下面的代码就能明白了:

 1 import redis
 2 #建立连接
 3 pool = redis.ConnectionPool(host=‘127.0.0.1‘, port=6379)
 4 r = redis.Redis(connection_pool=pool)
 5
 6 r.setbit("uv_count1", 5,1)  #每来一个连接,则让字节位设为1
 7 r.setbit("uv_count1", 8,1)
 8 r.setbit("uv_count1", 3,1)
 9 r.setbit("uv_count1", 3,1) #重复的不计算
10 print("uv_count:", r.bitcount("uv_count1"))
11
12 输出:uv_count: 3

比如:当前第500位用户在线,则将第500个bit置为1(默认为0)。bitcount统计二级制位中1的个数,setbit和bitcount配合使用,轻松解决当前在线用户数的问题。1字节=8位,那么10m=8000万位,即一个亿的在线用户也就10m多的内存就可搞定,这优化不得了!!

三、redis基本hash,list,set基本操作

我会直接用运行的截图来讲hash,list,set基本操作,不然有点无聊~~

Hash操作,redis中Hash在内存中的存储格式如下图:

1. hash基本操作

List操作,redis中的List在在内存中按照一个name对应一个List来存储。如图:

2. list基本操作

列表的某一个值前或后插入一个新值

r.lpush()  从左边开始放数据
r.rpush()   从右边开始放数据

 3. set基本操作

四、redis的16个数据库与有序集合

1. 16个数据库

Redis有默认16个数据库,默认在0库,可以切换(eg:切换到15号数据库: select 15);但在python中,出于安全考虑,在python的API没有切换数据库的概念,可以在连接调用时指定调用的数据库,但一连接上了就不能切换了。

move(name, db))
     # 将redis的某个值移动到指定的db下

2. 有序集合

有序集合: 在集合的基础上,为每个元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。

有序集合的基本操作

五、redis发布与订阅

应用场景:一登陆QQ右上角会有广告。
发布者:服务器
订阅者:个人用户

发布与订阅必须在同一个频道上(类似于收音机),不然发布方发布后,订阅方接收不到!

redis_helper.py文件(公共类)

 1 import redis
 2
 3
 4 class RedisHelper(object):
 5
 6     def __init__(self):
 7         self.__conn=redis.Redis(host=‘127.0.0.1‘)
 8         self.chan_sub=‘fm88.7‘          #设置两个频道,订阅频道
 9         self.chan_pub=‘fm88.7‘         #发布频道
10
11     def public(self,msg):
12         self.__conn.publish(self.chan_pub,msg)        #发布消息
13         returnTrue
14
15     def subscribe(self):
16         pub=self.__conn.pubsub()               #生成实例 打开收音机
17         pub.subscribe(self.chan_sub)     #拧到那个台
18         m=pub.parse_response()          #准备听,未阻塞,再调用一次就阻塞
19         print(m)        #[b‘subscribe‘, b‘fm88.7‘, 1]
20         return pub             #返回实例

redis_sub.py

1 from redis_helper import RedisHelper
2
3 obj=RedisHelper()
4 redis_sub=obj.subscribe()        #返回实例
5
6 while True:7     msg=redis_sub.parse_response()       #听
8 print(msg)              #有消息则打印,无消息则阻塞

redis_pub.py

from redis_helper importRedisHelper

obj=RedisHelper()
return1=obj.public(‘love‘)
print(return1)

运行结果(客户端): 可并发处理多个客户端。

[b‘subscribe‘, b‘fm88.7‘, 1]
[b‘message‘, b‘fm88.7‘, b‘love‘]
[b‘message‘, b‘fm88.7‘, b‘love‘]

原文地址:https://www.cnblogs.com/ExMan/p/10240459.html

时间: 2024-10-28 21:26:00

python之redis的相关文章

使用Python操作Redis

1. 安装pyredis 首先安装pip 1 2 3 4 5 6 7 8 <SHELL># apt-get install python-pip ...... <SHELL># pip install --proxy=http://172.1.2.6:8080 redis Downloading redis-2.9.1.tar.gz (62kB): 62kB downloaded Running setup.py (path:/tmp/pip_build_root/redis/se

Python学习之使用Python操作Redis数据库

最近在写一个检查一台服务器上所有游戏区服配置文件中redis某个key值大小的脚本,本打算使用shell+awk+sed的方式去解决这个问题,但是由于redis的配置信息是php数组形式.shell脚本一时没有写出来,就请教他人帮忙写了个python脚本,但是自己python不是很精通,于是按照脚本中涉及到的python知识现学现用,然后根据自己的需求更改脚本.这里分享一下如何使用python操作redis数据库. Redis的Python驱动源码下载地址是https://github.com/

Redis之Python 使用 Redis

Python 使用 Redis 参考文档: http://redis.cn/clients.html#python https://github.com/andymccurdy/redis-py 安装Redis $ sudo pip install redis 简单的redis操作 字符串string操作 In [1]: import redis In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0, password='

python操作redis

模块安装: easy_install python-redis 模块名称: redis 连接redis #!/usr/bin/env python import redis def connect_redis(ip): try: r = redis.Redis(ip=ip) #默认端口 6379 ,db=0,如果有变化,可以在创建对象的时候如下: r = redis.Redis(ip=ip,db=10,port=6379) return r except ImportError as e: pr

Python—操作redis

Python操作redis 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建,存在则修改 r.set('name', 'zhangsan') '''参数: set(name, value, ex=None, px=None, nx=False, xx=False) ex,过期时间(秒) px,过期时间(毫秒) nx,如果设置为True,则只有name不存在时,当前set操作才执行,同setn

Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含string(字符串).hash(哈希).list(链表).set(集合)和zset(有序集合),这些数据类型都支持push/pop.add/remove及取交集和并集及更丰富的操作,redis支持各种不同方式的排序.为了保证效率,数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改

使用python对redis操作

写在前面 首先声明,这是为了学习python对redis操作而写的一个小demo,包括了这几天网站找到的一些资料,综合总结出来一些东西,最后附上我写的一个用python操作redis的一个demo: 模块安装 python提供了一个模块redis-py来使我们很方便的操作redis数据库,安装该模块也很简单,直接使用pip安装就行,命令如下: pip install redis 安装完之后,使用import调用一下就能知道是否安装成功,在python界面下输入import redis,如果不报错

Python Moniotr Redis

参考本人的监控篇: Python Monitor Redis

python之 Redis

Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性

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

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