Python 学习笔记 - Redis

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

Redis 和Memcached类似 也是一个开源的内存存储系统,存储格式也是通过键值对的方式。不过和memcached比起来,memcached的value只支持字符串,而redis支持字符串,列表,集合,hash等等;这些数据类型都支持push/pop,add/remove等操作,而且都是原子性的,也就是类似数据库的事物特征一样,所有的操作要么全部完成,要么全部失败,然后回滚到之前的状态。


现在来看看他的简单使用和发布订阅的功能。


服务器安装

1
2
3
4
[root@sydnagios ~] # wget http://download.redis.io/releases/redis-3.0.6.tar.gz 
[root@sydnagios ~] # tar xzf redis-3.0.6.tar.gz
[root@sydnagios ~] # cd redis-3.0.6/
[root@sydnagios redis-3.0.6] # make

装好的界面如下,使用默认的配置文件,他的访问端口是6379

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
make[ 1 ]: Leaving directory ` / root / redis - 3.0 . 6 / src'
[root@sydnagios redis - 3.0 . 6 ] # src/redis-server
24344 :C  07  Nov  10 : 40 : 21.763  # Warning: no config file specified, using the default confif
24344 :M  07  Nov  10 : 40 : 21.764  *  Increased maximum number of  open  files to  10032  (it was  or .
                 _._
            _. - ``__ '' - ._
       _. - ``    `.  `_.  '' - ._           Redis  3.0 . 6  ( 00000000 / 0 64  bit
   . - `` . - ```.  ```\ /     _.,_ '' - ._
  (    '      ,       . - `  | `,    )     Running  in  standalone mode
  |` - ._` - ... - ` __... - .`` - ._| '` _.-' |     Port:  6379
  |    ` - ._   `._     /      _. - '    |     PID:  24344
   ` - ._    ` - ._  ` - . /   _. - '    _.-'
  |` - ._` - ._    ` - .__. - '    _.-' _. - '|
  |    ` - ._` - ._        _. - '_.-'     |           http: / / redis.io
   ` - ._    ` - ._` - .__. - '_.-'     _. - '
  |` - ._` - ._    ` - .__. - '    _.-' _. - '|
  |    ` - ._` - ._        _. - '_.-'     |
   ` - ._    ` - ._` - .__. - '_.-'     _. - '
       ` - ._    ` - .__. - '    _.-'
           ` - ._        _. - '
               ` - .__. - '
24344 :M  07  Nov  10 : 40 : 21.766  # WARNING: The TCP backlog setting of 511 cannot be enforced.
24344 :M  07  Nov  10 : 40 : 21.766  # Server started, Redis version 3.0.6
24344 :M  07  Nov  10 : 40 : 21.766  # WARNING overcommit_memory is set to 0! Background save may.
24344 :M  07  Nov  10 : 40 : 21.766  # WARNING you have Transparent Huge Pages (THP) support enab.
24344 :M  07  Nov  10 : 40 : 21.766  *  The server  is  now ready to accept connections on port  6379

然后别忘记打开防火墙端口

1
2
3
[root@sydnagios ~] # firewall-cmd --add-port=6379/tcp --permanent
success
[root@sydnagios ~] # systemctl restart firewalld



接下来用同一个目录下的客户端程序测试一下,成功设置和获取数据

1
2
3
4
5
6
[root@sydnagios redis - 3.0 . 6 ] # src/redis-cli
127.0 . 0.1 : 6379 set  foo bar
OK
127.0 . 0.1 : 6379 > get foo
"bar"
127.0 . 0.1 : 6379 >


现在看看Python下如何调用。


首先安装redis模块

1
2
3
4
5
C:\WINDOWS\system32>pip  install  redis
Collecting redis
   Using cached redis-2.10.5-py2.py3-none-any.whl
Installing collected packages: redis
Successfully installed redis-2.10.5


第一个例子:

1
2
3
4
5
6
import  redis
r = redis.Redis(host = 'sydnagios' ,port = 6379 )
r. set ( 'name' , 'John' )
print (r.get( 'name' ))
- - - - - - -
b 'John'

除了直接连接 也可以通过连接池连接,默认每个redis实例有自己的连接池,通过这种方式,可以多个实例共享一个连接池

1
2
3
4
import  redis
pool = redis.ConnectionPool(host = 'sydnagios' ,port = 6379 )
r = redis.Redis(connection_pool = pool)
print (r.get( 'name' ))


redis和memcached比起来,因为他支持多种数据结构,因此对应的操作函数也很多,几乎是memcached的10倍

下面是一些常见的,具体的函数使用可以参考 http://www.cnblogs.com/wupeiqi/articles/5132791.html


批量设置,批量获取

1
2
3
4
5
6
pool = redis.ConnectionPool(host = 'sydnagios' ,port = 6379 )
r = redis.Redis(connection_pool = pool)
r.mset(name = 'kevin' ,age = 14 )
print (r.mget( 'name' , 'age' ))
- - - - - - - - - - -
[b 'kevin' , b '14' ]


自增

1
2
3
4
5
6
7
import  redis
pool = redis.ConnectionPool(host = 'sydnagios' ,port = 6379 )
r = redis.Redis(connection_pool = pool)
r.incrby( 'age' , 10 )
print (r.get( 'age' ))
- - - - - - -
b '24'


删除

1
2
3
import   redis
r = redis.Redis(host = 'sydnagios' ,port = 6379 )
r.delete( 'set1' )

Hash批量操作

1
2
3
4
5
6
7
import  redis
pool = redis.ConnectionPool(host = 'sydnagios' ,port = 6379 )
r = redis.Redis(connection_pool = pool)
r.hmset( 'computer' ,{ 'Macbook' : 20000 , 'Surface3' : 5000 , 'iPhone7' : 9000 })
print (r.hmget( 'computer' , 'Macbook' ))
- - - - - - - -
[b '20000' ]


list操作

1
2
3
4
5
6
7
8
9
10
11
import   redis
r = redis.Redis(host = 'sydnagios' ,port = 6379 )
r.lpush( 'list1' , 'apple' )
r.lpush( 'list1' , 'pear' )
print (r.llen( 'list1' ))
print (r.lpop( 'list1' ))
print (r.llen( 'list1' ))
- - - - - -
2
b 'pear'
1


set操作,集合的元素不可以重复

1
2
3
4
5
6
7
8
9
import   redis
r = redis.Redis(host = 'sydnagios' ,port = 6379 )
r.sadd( 'set1' , 'orange' )
r.sadd( 'set1' , 'mango' )
print (r.scard( 'set1' ))
print (r.smembers( 'set1' ))
- - - - - - - - -
2
{b 'mango' , b 'orange' }


管道

默认redis-py在执行一次操作请求的时候会自动连接,然后断开;我们可以通过管道,一次性传入多条操作然后执行。

1
2
3
4
5
6
7
8
9
10
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import  redis
pool  =  redis.ConnectionPool(host = 'sydnagios' , port = 6379 )
=  redis.Redis(connection_pool = pool)
# pipe = r.pipeline(transaction=False)
pipe  =  r.pipeline(transaction = True )
r. set ( 'name' 'alex' )
r. set ( 'age' 16 )
pipe.execute()



因为redis的函数实在太多 这里就不一一赘述了。


现在来看一个redis的使用场景,发布和订阅。


简单的说,发布者可以对一个频道发布数据,然后凡是订阅了这个频道的人都可以收到信息。


s3.py

1
2
3
4
5
6
7
8
9
10
11
12
import  redis
class  RedisHelper:
     def  __init__( self ):
         self .__conn  =  redis.Redis(host = 'sydnagios' )
     def  publish( self , msg, chan):
         self .__conn.publish(chan, msg)
         return  True
     def  subscribe( self , chan):
         pub  =  self .__conn.pubsub()
         pub.subscribe(chan)
         pub.parse_response()
         return  pub


s4.py(订阅者)

1
2
3
4
import  s3
obj  =  s3.RedisHelper()
data  =  obj.subscribe( 'fm111.7' )
print (data.parse_response())


s5.py(发布者)

1
2
3
import  s3
obj  =  s3.RedisHelper()
obj.publish( 'alex db' 'fm111.7' )


先执行订阅者的代码,进入等待状态,然后执行发布者的程序,对指定的channel发送数据‘alex db’,订阅者一方会收到以下数据

1
[b 'message' , b 'fm111.7' , b 'alex db' ]





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1870139,如需转载请自行联系原作者

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
27 1
|
2月前
|
存储 缓存 NoSQL
在Python Web开发过程中:数据库与缓存,Redis在Web开发中的常见应用场景有哪些?
Redis在Python Web开发中常用于缓存、会话管理、分布式锁、排行榜、消息队列和实时分析。作为内存数据存储,它提供高效的数据结构(如字符串、哈希、列表、集合、有序集合),支持会话存储、互斥操作、计数与排名、队列实现及实时数据处理。其高速性能和丰富功能使其成为多场景下的理想选择。
26 5
|
22天前
|
缓存 NoSQL Redis
Python缓存技术(Memcached、Redis)面试题解析
【4月更文挑战第18天】本文探讨了Python面试中关于Memcached和Redis的常见问题,包括两者的基础概念、特性对比、客户端使用、缓存策略及应用场景。同时,文章指出了易错点,如数据不一致和缓存淘汰策略,并提供了实战代码示例,帮助读者掌握这两款内存键值存储系统的使用和优化技巧。通过理解其核心特性和避免常见错误,可以提升在面试中的表现。
28 2
|
1月前
|
前端开发 安全 JavaScript
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
|
23天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
315 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
26天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
26天前
|
存储 数据库 数据安全/隐私保护
基于Django的Python应用——学习笔记
基于Django的Python应用——学习笔记
|
2月前
|
存储 C语言 芯片
【Python】学习笔记day1
【Python】学习笔记day1
34 1
|
2月前
|
缓存 NoSQL Redis
在Python Web开发过程中:数据库与缓存,除了Redis是内存数据库以外,还有哪些原因使其运行速度快?
Redis在Python Web开发中快速的原因:内存存储、多样化数据结构(如字符串、哈希、列表等)简化数据模型,单线程处理提高效率,结合非阻塞I/O;RDB和AOF提供持久化保障;TCP+二进制协议减少网络开销;管道技术提升通信效率。这些设计使Redis能高效处理高并发请求。
23 3
|
2月前
|
算法 搜索推荐 测试技术
python排序算法及优化学习笔记1
python实现的简单的排序算法,以及算法优化,学习笔记1
35 1