Redis数据操作和与Python交互
文章目录
一、数据结构
-
redis是key-value的数据结构,每条数据都是⼀个键值对
- 键的类型是字符串
注意:键不能重复
- 值的类型分为五种:
- 字符串string
- 哈希hash
- 列表list
- 集合set
- 有序集合zset
- 数据操作行为
- 保存
- 修改
- 获取
- 删除
1.String 字符串类型
-
是redis中最基本的数据类型,一个key对应一个value。
- String类型是
二进制安全的,意思是 redis 的 string可以包含任何数据
。如数字,字符串,jpg图片或者序列化的对象。
string类型:主要存储字符串
操作 | 命令 |
---|---|
设置键值 | set key value |
设置键值与过期时间 | setex key seconds(单位为秒) value |
设置多个键 | met key1 value1 key2 value2 … |
追加值 | append key value |
获取值 | get key |
获取多个 键的值 | mget key1 key2 … |
使用:get 、 set 、 del 、 incr、 decr 等
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
"3"
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
"103"
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
"102"
-
实战场景:
- 1.
缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力
。 - 2**.计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。**
3.session:常见方案spring session + redis实现session共享
,
2.Hash (哈希)
-
是一个Mapmap,指值本身又是一种键值对结构
hash类型:主要用于存储对象,对象的结构为属性和值
操作 | 命令 |
---|---|
设置单个属性 | hset key field value (例:hset user name xiaoming) |
设置多个属性 | hmset key fiel1 value1 field2 value2… |
获取指定键所有属性 | hkeys key |
获取一个属性的值 | hget key field |
获取多个属性的值 | hmget key field1 field2… |
获取所有属性的值 | hvals key |
删除属性 | hdel key field1 field2… |
如 value={{field1,value1},......fieldN,valueN}}
使用:所有hash的命令都是 h 开头的 hget 、hset 、 hdel 等
127.0.0.1:6379> hset user name1 hao
(integer) 1
127.0.0.1:6379> hset user email1 hao@163.com
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "[email protected]"
127.0.0.1:6379> hget user user
(nil)
127.0.0.1:6379> hget user name1
"hao"
127.0.0.1:6379> hset user name2 xiaohao
(integer) 1
127.0.0.1:6379> hset user email2 xiaohao@163.com
(integer) 1
127.0.0.1:6379> hgetall user
1) "name1"
2) "hao"
3) "email1"
4) "[email protected]"
5) "name2"
6) "xiaohao"
7) "email2"
8) "[email protected]"
-
实战场景:
- 1.缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
3.列表
- List 说白了就是链表(redis 使用双端链表实现的List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
使用列表的技巧
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
list类型:存储列表
扫描二维码关注公众号,回复:
11332443 查看本文章
操作 | 命令 |
---|---|
在左侧插入数据 | lpush key value1 value2… |
在右侧插入数据 | rpush key value1 value2… |
在指定元素前插入 | linsert key before 元素 插入元素 |
在指定元素后插入 | linsert key after 元素 插入元素 |
获取指定范围值 | lrange key start stop(支持负索引) |
设置指定索引位置的值(修改) | lset key index value |
删除指定元素 | lrem key count value (count>0表示从头到尾删除的次数,count=0删除所有,count<0表示从尾到头删除的次数) |
-
使用:
127.0.0.1:6379> lpush mylist 1 2 ll ls mem
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "mem"
2) "ls"
3) "ll"
4) "2"
5) "1"
127.0.0.1:6379>
-
实战场景:
- 1.timeline:例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
4.Set 集合
-
集合类型也是用来保存多个字符串的元素
- 但和列表不同的是:
-
集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。
使用:命令都是以s开头的 sset 、srem、scard、smembers、sismember
set类型:存储无序集合
操作 | 命令 |
---|---|
添加元素 | sadd key member1 member2… |
获取所有元素 | smembers key |
删除指定元素 | srem key |
127.0.0.1:6379> sadd myset hao hao1 xiaohao hao
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "xiaohao"
2) "hao1"
3) "hao"
127.0.0.1:6379> SISMEMBER myset hao
(integer) 1
-
实战场景;
- 1.标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
- 2.点赞,或点踩,收藏等,可以放到set中实现
5.zset 有序集合
-
有序集合和集合有着必然的联系,保留了集合不能有重复成员的特性
- 区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。(有序集合中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)。
使用: 有序集合的命令都是 以 z 开头 zadd 、 zrange、 zscore
zset类型:有序集合,每个元素关联一个double类型的score,表示权重,按权重排序
操作 | 命令 |
---|---|
添加元素 | zadd key score1 member1 score2 memeber2… |
返回指定范围元素 | zrange key start stop |
返回指定范围权重的元素 | zrangebyscore key min max |
返回指定成员的权重 | zscore key member |
删除指定元素 | zrem key member1 member2… |
删除指定权重范围元素 | zrembyscore key min max |
127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao
(integer) 2
127.0.0.1:6379> ZRANGE myscoreset 0 -1
1) "xiaohao"
2) "hao"
127.0.0.1:6379> ZSCORE myscoreset hao
"100"
-
实战场景:
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
6.键命令
操作 | 命令 |
---|---|
查找键(参数支持正则) | keys pattern(keys 查看所有键,keys a查找a开头的键) |
判断键是否存在 | exists key(存在返回1,不存在返回0) |
查看键的类型 | type key |
删除键及对应的值 | del key1 key2… |
设置键的过期时间 | expire key seconds |
查看键的有效时间 | ttl key |
二、Redis与Python交互
1.虚拟环境中安装redis
-
安装包
安装Redis的有3种方式https://github.com/andymccurdy/redis-py
- 第一种:进⼊虚拟环境py_django,联⽹安装包redis
pip install redis
- 第二种:进⼊虚拟环境py_django,联⽹安装包redis
easy_install redis
- 第三种:到中⽂官⽹-客户端下载redis包的源码,使⽤源码安装
一步步执行
wget https://github.com/andymccurdy/redis-py/archive/master.zip
unzip master.zip
cd redis-py-master
sudo python setup.py install
2.调⽤模块
引⼊模块
from redis import *
这个模块中提供了StrictRedis对象(Strict严格),⽤于连接redis服务器
,并按照不同类型提供 了不同⽅法,进⾏交互操作
3.StrictRedis对象⽅法
- 通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
sr = StrictRedis(host='localhost', port=6379, db=0)
简写
sr=StrictRedis()
-
根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致
-
例:
准备:
在桌面上创建redis目录
使用pycharm打开 redis目录
创建redis_string.py文件
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
except Exception as e:
print(e)
-
string-增加
⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#添加键name,值为itheima
result=sr.set('name','itheima')
#输出响应结果,如果添加成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
-
string-获取
⽅法get,添加键对应的值,如果键存在则返回对应的值,如果键不存在则返回None
编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#获取键name的值
result = sr.get('name')
#输出键的值,如果键不存在则返回None
print(result)
except Exception as e:
print(e)
-
string-修改
⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.set('name','itcast')
#输出响应结果,如果操作成功则返回True,否则返回False
print(result)
except Exception as e:
print(e)
-
string-删除
⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,否则则返 回0
编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
result = sr.delete('name')
#输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
print(result)
except Exception as e:
print(e)
-
获取键
⽅法keys,根据正则表达式获取键
编写代码如下
from redis import *
if __name__=="__main__":
try:
#创建StrictRedis对象,与redis服务器建⽴连接
sr=StrictRedis()
#获取所有的键
result=sr.keys()
#输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
print(result)
except Exception as e:
print(e)
操作方法基本与redis数据库操作一样
4.django存储session
- session的redis存储配置
安装包
pip install django-redis-sessions==0.5.6
- 修改settings文件,增加如下项
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
- 测试
打开booktest/views.py文件,创建session_set和session_get视图如下
def session_set(request):
request.session['name']='itheima'
return HttpResponse('ok')
def session_get(request):
name=request.session['name']
return HttpResponse(name)
- 打开booktest/urls.py文件,配置url如下
url(r'^session_set/$',views.session_set),
url(r'^session_get/$', views.session_get),
- 通过redis-cli客户端查看
Base64在线解码http://base64.xpcha.com/