标签搜索

目 录CONTENT

文章目录

Redis数据操作和与Python交互.md

小小城
2021-08-22 / 0 评论 / 0 点赞 / 7 阅读 / 6,992 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Redis数据操作和与Python交互

@[toc]

一、数据结构

  •  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) "hao@163.com"
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) "hao@163.com"
5) "name2"
6) "xiaohao"
7) "email2"
8) "xiaohao@163.com"
  •  实战场景:
  • 1.缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。

3.列表

  •  List 说白了就是链表(redis 使用双端链表实现的List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
    在这里插入图片描述

使用列表的技巧

lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)

list类型:存储列表

操作命令
在左侧插入数据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),
0

评论区