Redis
Windows下直接解压可用,连接:https://pan.baidu.com/s/1rD4ujoN7h96TtHSu3sN_hA 密码:t02credis
1、简介
- redis是一种高速高性能的内存数据库,存储的是键值对数据;
- 因为极高的存储和访问速度,redis常被用来做为数据缓存服务器;
- 另外redis是支持数据持久化的(即redis会自动将数据写入磁盘)——这是redis大杀四方的重要缘由;
- redis支持多个slave端同时向master端进行写入,这常常被用在分布式爬虫等场景中;
- 2010年之后redis开始大面积流行,关系型数据库(核心数据)+redis(缓存)是常规的、常见的数据解决方案;
1 Redis的数据类型
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
2、Redis管理基本操做
- redis-server.exe redis.windows.conf // 使用配置启动redis服务
- redis-cli.exe // 打开客户端
- redis-cli --help // 查看客户端帮助
- redis-cli -h 127.0.0.1 -p 6379 -a 123456 // 使用密码访问远程redis
- redis-cli --stat -a 123456 // 查看服务状态
- help @xxx // 分类帮助信息
- help @connection
- select 15 // 选择最后一个数据库(共提供16个数据库)
- quit // 退出客户端
- help @server
- flushdb //清空当前库数据,谨慎使用
- flushall // 清空全部数据库,谨慎使用
- monitor // 监视服务端收到的信息
- auth 123456 // 使用密码登陆
- ping // 测试服务端链接状态
3、Redis数据基本操做
一、 key
- keys * //显示全部键,慎用,数据量大时致使卡死
- keys a* // 显示全部以a开头的键
- exists name age //判断name和age这两个键存在几个
- type name //查看值的类型
- del name age //删除键
- expire name 30 //name键值30秒过时
- ttl name //查看键值的过时时间
- persist name // 取消键的过时时间
- rename name nickname // 重命名键(这样作不安全,容易覆盖已有数据)
- renamenx name nickname // 确保不会覆盖其它键才重命名(nx=not exists,x后缀=exists)
二、 字符串string
- 设置
- set name bill //设置键值
- setex name 20 bill //键值20秒后过时
- mset age 60 gender male //一次性存储多个键值
- 获取
- get name //不存在则返回null
- mget name age //一次性拿取多个键值
- 运算
- incr/decr age //将age加减1
- incrby/decrby age 20 //将age加减20
- 其它
- append name gates //向原有value拼接字符串,不存在时等同于set
- strlen key //获取值长度
三、 哈希hash
- hset p1 name bill // 设置p1对象的name为bill
- hset p1 age 18 // 设置p1对象的age为18
- hmset p2 name jobs age -1 //设置p2对象的name为jobs,age为-1
- hget p1 name // 获取p1的name属性值
- hmget p1 name age // 同时获取p1的name和age
- hgetall p1 // 获取p1的所有键值
- hkeys p1 // 获取p1的所有键
- hvals p1 // 获取p1的所有值
- hlen p1 // 获取p1中全部字段的数量
- hexists p1 name // 判断p1中是否有name字段
- hdel p1 name // 删除p1中的name字段
- hdel p2 name age // 删除p2中的name和age字段
- hstrlen p1 age // p1中的age的长度
四、 列表list
- lpush mlist 2 // 从左侧向列表mlist追加元素2
- rpush mlist 3 // 从右侧向列表mlist追加元素3
- linsert mlist after 3 4 // 在列表mlist中3的后边追加元素4
- lset mlist 1 200 // 设置列表mlist中的第1个元素为200(下标从0开始)
- lrange mlist 0 3 // 查看列表mlist中下标[0到3]的元素
- lrange mlist 0 -1 //从头看到尾
- lpop mlist // 从列表左侧弹出一个值
- rpop mlist // 从列表右侧弹出一个值
- ltrim mlist 0 1 // 修剪掉mlist下标[0,1]之外的元素
- llen mlist // 列表元素个数
- lindex mlist 0 // 获取mlist中下标0的元素
五、 集合set
- sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
- smembers mset // 查看集合mset中的元素
- scard mset // 查询集合元素个数
- sinter mset mset2 //求mset和mset2的交集
- sunion mset mset2 // 求mset和mset2的并集
- sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2无的部分)
- sismember mset 3 //判断3是不是mset中的元素
六、 有序集合zset
- zadd mzset 10 bill 9 jobs 6 jackma // 添加多个值及相应权重
- zrange mzset 0 -1 // 返回第一个到最后一个之间全部的元素,按权重升序排列
- zcard mzset // 元素个数
- zcount mzset 6 10 // 下标6-10之间的元素个数
- zscore mzset jackma // 返回 jackma在mzset中的权重
4、图形界面客户端
连接:https://pan.baidu.com/s/1Ndt61mEK2IFIugUkfdlzuw 密码:q8i5数据库

5、与Python的交互
方法一:
模块引入参考
中的安装第三方模块windows
方法二:缓存
pip install redis
模块名称:redis。安全
- rClient = redis.Redis(…)
- rClient.set(‘name’,‘bill’)
import redis
client = redis.Redis(
host='localhost',
port=6379,
db=5,
password='123456'
)
ret = client.set("name", "bill")
print(client.get('name'))#b'bill'
print(ret, type(ret))#True <class 'bool'>
client.mset({'age': 60, 'gender': 'male'})
print(client.mget('name', 'age', 'gender'))#[b'bill', b'60', b'male']
client.hmset("p1", {'name': 'jobs', 'age': -1, 'gender': 'male'})
print(client.hgetall('p1'))#{b'name': b'jobs',
b'age': b'-1',
b'gender': b'male'}
client.lpush('mlist', 2, 3, 4)
print(client.lrange('mlist', 0, -1))#[b'4', b'3', b'2']
client.sadd('mset', 'bill', 'steve', '被KO的艺龙')
print(client.smembers('mset'))#{b'steve',
b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99',
b'bill'}
client.zadd('mzset', 'bill', 10, 'steve', 11, jack=8)
print(client.zrange('mzset',0,-1))#[b'jack', b'bill', b'steve']
print('GAME OVER!')
输出:
Connected to pydev debugger (build 173.4674.54)
b'bill'
True <class 'bool'>
[b'bill', b'60', b'male']
{b'name': b'jobs', b'age': b'-1', b'gender': b'male'}
[b'4', b'3', b'2']
{b'bill', b'\xe8\xa2\xabKO\xe7\x9a\x84\xe8\x89\xba\xe9\xbe\x99', b'steve'}
[b'jack', b'bill', b'steve']
GAME OVER!
6、redis事务
- redis支持事务的方式
- 将批量数据操做逐个加入队列
- 若是批量操做过程当中发生异常,不提交事务便可
- 提交事务,执行队列中的全部操做,并保证其原子性
- 注意事项
- 数据操做在加入队列时不会进行语法检查
- 若是数据操做存在语法错误,会形成只有部分数据提交的BUG
- 此时redis也并不支持事务回滚
- 因此语法错误必须在上线前自行完成检查和修正
- 主要事务操做
- 命令行执行事务
- WATCH key1 key2 key3
- 观察本次事务要修改的key,若是该key在事务执行过程当中被其它事务修改,则当前事务提交不能成功
- 目的:保证并发安全
- multi
- 执行具体事务操做(增删改查)
- exec
- 提交事务,若是观察的key被其它事务并发修改,则本次事务提交无效
- Python中执行事务
- API
- pipe = client.pipiline()
- pipe.watch(‘a’, ‘b’, ‘c’)
- pipe.multi()
- CRUD…
- except WatchError as we:…
- pipe.reset()
- pipe.execute()
'''
redis事务
·redis事务机制保证【正确事务代码】的原子性(所有执行或所有放弃)
·对于语法错误的代码,redis不支持异常和回滚
·redis的态度:语法错误应该在上线以前自行发现并修正
'''
import redis
txClient = redis.Redis(
host='localhost',
port=6379,
db=7,
password='123456' )
pipe = txClient.pipeline(transaction=True)
try:
pipe.watch('who', 'a', 'b', 'c')
pipe.multi()
pipe.set('who', 'leijun', ex=60 * 5)
print(pipe.get('who'))
pipe.hmset('p1', {'who': 'leijun', 'age': 50, 'word': 'are you ok'})
print(pipe.hgetall('p1')) # print(5 / 0)
# 普通业务异常,被try所捕获,事务不会提交
# pipe.incr("p1")
# redis语法错误,只有提交时才会发生异常且没法回滚,必须在上线前予以修正
pipe.incr('a')
pipe.incr('b')
pipe.incr('c')
except WatchError as we:
pipe.reset()#清空管道
print('监控数据被外界污染,事务已取消!we=',we)
except Exception as e:
print("bad luck:e=", e)
print('事务未提交')
else:
try:
pipe.execute()
print('事务已提交')
except Exception as e:
print('事务提交异常,请检查代码语法!e=',e)
输出:
Connected to pydev debugger (build 173.4674.54)
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
Pipeline<ConnectionPool<Connection<host=localhost,port=6379,db=7>>>
事务已提交