Python使用Redis数据库
Redis 简介
Redis是开源的高性能Key-Value数据库,可以用于缓存等用途.
Redis可以提供事务和持久化支持保证并发安全性,并提供TTL(time to life)服务.
使用Redis
Ubuntu系统可以用包管理器安装Redis服务:
sudo apt-get install redis-server
并安装客户端:
sudo apt-get install redis-tools
进入Redis客户端
redis-cli
登录远程Redis服务
redis-cli -h host -p port -a password
Redis基本操作指令
Redis的Key-Value均为大小写敏感的,但是Redis指令对大小写不敏感.
Redis使用字符串作为Key,常用操作命令有:
SET key val
设置键值对,无则新建有则更新
127.0.0.1:6379> set user name
OK
DEL key
删除键值对, 返回删除的条数
127.0.0.1:6379> del user
(integer) 1
GET key
返回Value
127.0.0.1:6379> get user
"name"
EXISTS key
检查指定键值对是否存在
127.0.0.1:6379> exists user
(integer) 1
KEYS pattern
使用通配符筛选显示所有符合条件的键
127.0.0.1:6379> keys *
1) "playing_yichya"
2) "playing_yy"
3) "online_yichya"
4) "user"
5) "online_yy"
127.0.0.1:6379> keys *_*
1) "playing_yichya"
2) "playing_yy"
3) "online_yichya"
4) "online_yy"
RANDOMKEY
随机返回一个键
127.0.0.1:6379> randomkey
"hm1"
RENAME key newname
重命名键
127.0.0.1:6379> set user2 234
OK
127.0.0.1:6379> set user 233
OK
127.0.0.1:6379> rename user user2
OK
127.0.0.1:6379> get user
(nil)
RENAMEX key newname
重命名键, 不允许新名与已有的键名重复
QUIT
退出redis客户端
Redis TTL服务命令
EXPIRE key seconds
以秒为单位,指定键值对的生存周期
127.0.0.1:6379> expire user 10000
(integer) 1
PEXIRE key mseconds
以毫秒为单位,指定键值对的生存周期
TTL key
以秒为单位,返回键值对的剩余生存周期
127.0.0.1:6379> ttl user
(integer) 9996
PTTL key
以毫秒为单位,返回键值对的剩余生存周期
127.0.0.1:6379> pttl user
(integer) 9991684
PERSIST key
将键值对的生存周期设为永久
127.0.0.1:6379> persist user
(integer) 1
EXPIREAT key timestamp
使用Unix时间戳指定过期时间
Redis哈希命令
Redis哈希命令以Hash表作为数据结构, Hash表中所有键值对共享同样的TTL,并有着比通常键值对更快的操作速度.
HSET table key val
示例:
127.0.0.1:6379> hset hml yichya 233
(integer) 1
执行keys和hkeys命令,可以看出hash表的数据结构
127.0.0.1:6379> keys *
1) "hml"
2) "user"
127.0.0.1:6379> hkeys hml
1) "yichya"
HDEL table key
删除键
HGET table key
得到键值对
HKEYS tabel
得到哈希表上所有键
HGETALL table
返回所有key和value
127.0.0.1:6379> hgetall hml
1) "yichya"
2) "233"
Redis事务支持
MULTI
开启事务块
127.0.0.1:6379> multi
OK
EXEC
提交事务执行
DISCARD
放弃事务
WATCH key [key ...]
WATCH命令在事务执行之前监控Keys.
若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Null multi-bulk
UNWATCH
放弃所有WATCH
Python使用Redis数据库
redis-py是常用的python-redis连接器,使用python包管理器安装此模块:
pip install redis
在Python环境下导入redis模块
>>> from redis import Redis
>>> r = Redis()
Redis是封装了Redis数据库操作的类,并提供了类似的API.
使用JSON存储
除Redis-Hash表之外,redis-py将键值都作为字符串处理
>>> r.set('user', 233)
True
>>> r.get('user')
'233'
对于复杂数据类型,处理返回的字符串非常不便:
>>> r.set('user', [1,[{'name':'yichya'}]])
True
>>> r.get('user')
"[1, [{'name': 'yichya'}]]"
>>> result = r.get('user')
>>> list(result)
['[', '1', ',', ' ', '[', '{', "'", 'n', 'a', 'm', 'e', "'", ':', ' ', "'", 'y', 'i', 'c', 'h', 'y', 'a', "'", '}', ']', ']']
可以选择使用JSON作为存储类型,并以python内置json模块进行编码和解码.
另外,一个redis实例只维护一个数据表而应用中经常出现需要维护多个字典的情况.
草民建议使用prefix+key作为redis的键来模拟多个数据表.
草民写了一个简单的Redis-dict适配器,允许以类似字典的方式操作Redis数据库:
from redis import Redis
import json
class RedisDict:
def __init__(self, prefix=''):
self.data = Redis()
self.prefix = prefix
def get(self, key):
redis_key = self.prefix + '_' + key
redis_val = self.data.get(redis_key)
if redis_val is None:
return None
else:
return json.loads(redis_val)
def set(self, key, val):
redis_key = self.prefix + '_' + key
redis_val = json.dumps(val)
self.data.set(redis_key, redis_val)
def pop(self, key):
redis_key = self.prefix + '_' + key
self.data.delete(redis_key)
def __iter__(self):
for item in self.data.keys(self.prefix + '*'):
prefix, key = decode(item)
yield key
def decode(redis_key):
sep = redis_key.find('_')
prefix = redis_key[:sep]
key = redis_key[sep+1:]
return prefix, key
if __name__ == '__main__':
r = RedisCache('online')
r.set('user', [1,[{'name':'yichya'}]])
for item in r:
print(item)
print(r.get(item))
hash表操作
redis-py的hash操作与redis命令类似:
from redis import Redis
import json
class RedisDict:
def __init__(self, table):
self.session = Redis()
self.table = table
self.session.delete(table)
def get(self, key):
redis_val = self.session.hget(self.table, key)
if redis_val is None:
return None
else:
return json.loads(redis_val)
def set(self, key, val):
redis_val = json.dumps(val)
self.session.hset(self.table, key, redis_val)
def pop(self, key):
self.session.hdel(self.table, key)
def __iter__(self):
for key in self.session.hkeys(self.table):
yield key
用hash表模拟dict,这个实现比用前缀区分高效得多.
pipeline操作
Redis-Server是一个TCP服务器,使用pipline维护消息队列可以提高批量处理的效率.
>>> p = r.pipeline()
>>> p.set('yichya', 2333)
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=0>>>
>>> p.get('yichya')
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=0>>>
>>> p.execute()
[True, '2333']
参考链接:
Python使用Redis数据库的更多相关文章
- redis python 操作 Python操作Redis数据库
原文章于此:https://www.cnblogs.com/cnkai/p/7642787.html 有个人修改与改正 Python操作Redis数据库 连接数据库 StrictRedisfrom ...
- python学习笔记(十六)python操作redis数据库
Redis是一个key-value存储系统,它支持丰富的数据类型,如:string.list.set.zset(sorted set).hash. Redis特点 Redis以内存作为数据存储介质,所 ...
- Python操作Redis数据库
连接数据库 StrictRedis from redis import StrictRedis # 使用默认方式连接到数据库 redis = StrictRedis(host='localhost', ...
- Python读写Redis数据库
import redis class Database: def __init__(self): self.host = 'localhost' self.port = 6379 def write( ...
- python连接redis数据库的两种方式
代码: # __author__ = 'STEVEN' import redis # 方式1,直接连接 # r = redis.Redis(host='192.168.43.22',port=6379 ...
- python安装Redis数据库
where pip cd 切换这个目录 pip install redis import redis r = redis.Redis(host='127.0.0.1', port=6379) user ...
- Python之操作redis数据库
使用redis模块 一.操作redis 1.添加信息 (1)直接建key-value信息: 右键-Add New Key,手动添加key和value 右键-Console,打开控制台,写入命令 (2) ...
- Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库
操作数据库 一.数据库 数据库类型主要有关系型数据库和菲关系型数据库. 数据库:用来存储和管理数的仓库,数据库是通过依据“数据结构”将数据格式化,以记录->表->库的关系存储.因此数据查询 ...
- Python 操作Redis 转载篇
Python操作Redis数据库 连接数据库 StrictRedis from redis import StrictRedis # 使用默认方式连接到数据库 redis = StrictRedis( ...
随机推荐
- 探索TFS Git 库文件换行(CRLF)的处理方式
(2018.12.29 更新,增加Git处理方式) 在计算机的技术中,所有文本信息都会涉及换行的问题.例如,你在键盘上敲击一次Enter(回车)键,系统将在文本重增加一行,实际上系统已经在文件中插入了 ...
- C# RS232串口使用
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- Dependency injection configurations into views in asp.net core
本文展示如何在ASP.NET Core MVC Application Razor视图中注入和使用应用程序的配置信息. 将配置信息添加到appsettings.json中: { "Loggi ...
- Day 28面向对象的进阶-内置函数(__new__,__del__)
元类 创造 类 所有类的type 都是他的元类 类创造 对象 具体创造对象的方法 __new__方法 class 类名(classmata = type)#默认是 class 类名(class ...
- Day 21 序列化模块_Json,Pickle,Shelve
序列化 , 数据类型,列表 元组, 字符串 只有字符串能被写入文件中. 能在网络上传输的只能是bytes - 字符串 把要传输的和要存储的内容转换成字符串. 字符串 转换回 要传输和存储的内容 序列化 ...
- C++引用和指针的区别
一.引用和指针的定义 引用:它是给另一个变量取一个别名,不会再次分配空间(可以带来程序的优化) 指针:它是一个实体,需要分配空间 引用在定义的时候必须进行初始化,并且空间不能够改变. 指针在定义的 ...
- JQuery - Ajax和Tomcat跨域请求问题解决方法!
在JQuery里面使用Ajax和Tomcat服务器之间进行数据交互,遇到了跨域请求问题,无法成功得到想要的数据! 错误信息部分截图: 通过错误信息判断知道已经发生在Ajax跨域请求问题了! 当前Tom ...
- Flask从入门到精通之使用Flask-Migrate实现数据库迁移
在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不 ...
- mysql编写存储过程(2)
书接上回. 实例8:if-then -else语句 实例9:case语句: 实例10:循环语句,while ···· end while: 实例11:循环语句,repeat···· end repea ...
- WKWebView 里 JS 和 native 通信的例子
native 端 初始化 wkwebview,设置 message handler webView = WKWebView.init() let usecc = self.webView.config ...