当前位置:网站首页>Redis的基础与django使用redis
Redis的基础与django使用redis
2022-08-03 07:51:00 【m0_67401606】
文章目录
一、Redis的简介和安装
1.1 Redis简介
Redis是一个用c语言开发的非关系型(NoSQL)数据库,它将数据以key-value的形式存储在内存中,性能高并且开源、免费。
redis的应用场景:
- 缓存系统;
- 计数器:网站访问量、转发量、评论数……;
- 消息队列(发布订阅,阻塞队列);
- 排行榜(有序集合);
- 实时系统:垃圾邮件处理系统(布隆过滤器);
- ……
redis的其他特点:
- 支持数据持久化,可以将数据保存到磁盘中,实现永久存储;
- value支持多种数据类型:字符串Strings、链表Lists、集合Sets、有序集合Sorted Sets、哈希Hashes等等。
- 支持主从模式,可以配置集群,能支撑起大型的项目。
- ……
1.2 安装Redis
Ubuntu 下安装:
在终端中执行:
sudo add-apt-repository ppa:redislabs/redis sudo apt-get update sudo apt-get install rediswindows 下安装:
到官网下载安装包,直接安装即可。
测试是否安装成功:
redis-cli ping # 输出:PONG,则表示安装成功这是redis官方提供的简易redis客户端,可以执行redis的各种命令,要退出,输入:
quit后回车。指定ip、端口和密码:
redis-cli -h host -p port -a password
1.3 启动和关闭 Redis-server
三种启动方式:
默认启动方式:
redis-server指定参数启动:
redis-server --port 6380 # 指定端口为6380redis 的默认端口为6379。
指定配置文件启动:
redis-server redis.conf # 文件需要自行创建,文件名随意常用配置:
# 是否以守护进程方式启动 daemonize yes # 端口号 port 6379 # ip地址,默认的 127.0.0.1 不支持远程连接 bind 0.0.0.0 # 工作目录 dir "路径" # 日志位置 logfile "路径" # 关闭保护模式 protected-mode no # 设置密码 requirepass 123456 # 最大内存使用量,默认为0,表示无限制 maxmemory 128M
关闭 redis-server:
redis-cli shutdown
二、python操作redis
使用python操作redis,可以安装一个第三方库,名字就叫做redis。它提供了一些接口,能够使我们更加方便的操作redis。
安装:
pip install redis
2.1 普通连接
python操作redis,需要通过一个redis连接对象来进行:
import redis
# 创建连接对象
r = redis.Redis(host='localhost', port=6379, db=0)
# 执行具体操作
r.set('foo', 'bar') # 给key设置value
print(r.get('foo')) # 根据key获取value
# 打印:b'bar'
默认情况下,Python 3中的所有响应都以字节的形式返回。默认的编码是utf-8,但这可以通过指定redis的encoding参数来定制。
2.2 连接池
连接池是一种提高性能的技术手段,它提前创建好一些连接并保存在池中。当有请求时,就从连接池中直接取出一个连接,用完再放回去。这样就免去了创建连接和销毁连接的过程。
import redis
# 创建连接池
pool = redis.ConnectionPool(host='localhost', port=6379,
db=0, max_connections=1000)
# 从连接池获取连接对象
r = redis.Redis(connection_pool=pool)
# 像普通连接一样使用即可
max_connections指的是请求池中的最大连接数,默认是 2 31 2^{31} 231。
2.3 redis库的操作
redis库中的方法以及方法的参数与redis-cli的命令以及参数是一致的,方法名称对应命令,方法参数对应命令参数。因此,学会了redis-cli的命令,就学会了redis库的使用。
三、Redis基本操作
我们现在通过redis-cli 来学习一下redis的具体操作,它会提示参数,十分好用。
3.1 redis 通用命令
通过 redis-cli 连接 redis-server:
redis-cli [-p 端口 -h ip地址] # 默认连接本地地址和6379端口如果设置了密码:
redis-cli -a 密码也可以先正常连接,进入客户端后,输入
auth回车,再输入密码,完成验证。退出 redis-cli:
exit # 或quit查看服务器详细信息 :
info查看redis配置信息:
config get *修改redis配置:
config set requirepass 密码将所做的修改保存到配置文件:
config rewrite查看所有连接到服务器的客户端信息:
client list关闭客户端连接:
client kill ip:端口清空所有数据库:
flushall清空当前数据库:
flushdb选择一个数据库:
select 数字redis默认有16个数据库,编号0~15,默认的是第0个。
实时监控服务器:
monitor一般用于日志审计。
3.2 Key的操作
Redis的key是二进制安全的,这意味着我们可以使用任何二进制序列作为key,从像"foo"这样的字符串到JPEG文件的内容,甚至是空字符串。key的大小最大允许 512 MB。
删除指定的key:
DEL key1 key2 ...key被删除,value也就不复存在。
检查指定的key是否存在:
EXISTS key1 key2 ...存在几个,就返回几。
查看数据库中key的总数:
DBSIZE给key设置过期时间:
EXPIRE key 秒数到达指定秒数后,该key就会被删除(key删除则value跟着一起消失)。
查看剩余有效期:
TTL key去除过期限制:
PERSIST key返回符合给定模式(pattern)的所有key:
KEYS A* # 返回以A开头的key KEYS * # 返回所有key查看key所存储的value的数据结构类型:
type key重命名key:
RENAME OLD_KEY_NAME NEW_KEY_NAME移动key到指定数据库:
MOVE key db随机返回一个key:
RANDOMKEY
3.3 Value的操作(常用类型)
3.3.1 字符串(Strings)类型
string 是 redis 最基本的类型,它可以包含任何数据。比如jpg图片或者序列化的对象,string 类型的值最大能存储 512MB。
为指定的key设置value:
SET key value [EX 参数] [NX|XX]- EX:过期时间,单位为秒;
- NX:仅当该key不存在时,设置该key;
- XX:仅当该key存在时,设置该key;
获取指定key的value:
GET key为多个key设置多个value:
MSET key1 value1 key2 value2 ...获取所有给定key的值:
MGET key1 key2 ...给key设置一个新的value并返回旧的value:
GETSET key value # 返回旧value给指定key的value切片,然后返回子字符串:
GETRANGE key 起始索引 结束索引 SET key1 hello,world GETRANGE key1 0 4 # 返回"hello" GETRANGE key1 -5 -1 # 返回"world"重写指定位置后面的value值:
SETRANGE key 起始位置 value SET key1 hello,world SETRANGE key1 4 ,redis GET key1 # 返回"hell,redis"将key的整数值增加1:
INCR keykey中的value不是整数或者字面值不是整数,则会报错。
将key的整数值减少1:
DECR key在value后面追加内容:
APPEND key 追加的内容
3.3.2 哈希(Hashes)类型
redis的哈希类型是一个==“字段-值(field-value)”的集合==,类似于python中的字典。
设置key的内容:
HSET key field1 value1 [field2 value2 ...]获取key中指定字段的内容:
HGET key field获取key中多个字段的值:
HMGET key field1 [field2 ...]删除一个或多个字段:
HDEL key field1 [field2 ...]查看key中,指定字段是否存在:
HEXIETS key field获取指定key的所有字段和值(慎用):
HGETALL key迭代获取key中的所有字段和值(建议以此替代HGETALL):
HSCAN key cursor # 开始一次迭代时,cursor传入0返回值除了字段和值外,还有本次迭代后的游标(cursor)位置,我们需要在下一次调用中使用它作为游标参数。
而在开始一次全新的迭代时,游标的值应该传入0;
获取指定key中的所有字段:
HKEYS key获取指定key中的所有值:
HVALS key获取字段的数量:
HLEN key让字段的整数值加上一个增量:
HINCRBY key field 增量这个增量可以是负数,以此实现减少的效果。
3.3.3 链表(Lists)类型
Redis链表是根据插入顺序排序的字符串元素集合,它们是基于链表数据结构实现的。
在链表前面(左面)添加一个或多个元素:
LPUSH key element1 [element2 ...]在链表后面(右面)添加一个或多个元素:
RPUSH key element1 [element2 ...]获取链表长度:
LLEN key将元素插入链表的指定元素之前或之后:
LINSERT key BEFORE|AFTER 指定元素 要插入的元素在指定位置放入元素:
LSET key 索引 element新的元素会覆盖原来的元素。
从链表移除元素:
LREM key count elementcount > 0:表示从左往右移除count个与指定元素相等的元素;
count < 0:表示从右往左移除count个与指定元素相等的元素;
count = 0:表示移除所有与指定元素相等的元素;
移除并返回链表中的第一个或前几个元素:
LPOP key [count]移除并返回链表中的最后一个或后几个元素:
RPOP key [count]根据索引获取指定元素:
LINDEX key index删除并返回链表中的第一个元素,没有可用的元素就阻塞,直到有可用的元素:
BLPOP key [key ...] timeouttimeout指阻塞的最大秒数,是一个双精度值,设置为0表示无时间限制。
3.3.4 集合(Sets)类型
Redis的Sets是唯一的、无序的字符串元素的集合,不能出现重复的数据。
向集合添加一个或多个成员:
SADD key member [memebr1 ...]获取一个集合中成员的数量:
SCARD key返回集合中的所有成员:
SMEMBERS key判断给定的值是否是集合的成员:
SISMEMBER key member返回多个集合的交集:
SINTER key [key ...]返回多个集合的并集:
SUNION key [key ...]返回一个集合与给定集合的差集的元素:
SDIFF key1 key2从集合中随机返回一个成员并从集合中移除:
SPOP key [count]count用来设置随机返回的数量,不写就是1个。
从集合中删除指定成员:
SREM key member [member ...]
3.4.5 有序集合(Sorted Sets)类型
Redis的Sorted Sets类似于上面的Sets,但每个字符串元素都与一个名为score的浮点数值相关联。与Sets不同,Sorted Sets中的元素是按照它们的score从小到大排序,因此它可以检索一个范围内的元素(例如,获取前10个或下10个)。
向有序集合添加一个或多个成员,如果已经存在,则更新其score:
ZADD key [NX|XX] score member- NX:只添加新元素。不要更新已经存在的元素。
- XX:只更新已经存在的元素。不要添加新元素。
从有序集合中删除若干个元素:
ZREM key member [member ……]获取成员的score:
ASCORE key member增加成员的score值:
ZINCRBY key 增量 member迭代有序集合中的元素:
ZSCAN key 游标获取有序集合中的成员数:
ZCARD key按照索引获取一个范围内的成员:
ZRANGE key min max按照score获取一个范围内的成员:
ZRANGEBYSCORE min max获取成员的索引(从0开始):
ZRANK key member
更多redis 命令请参考官方文档:传送门
四、管道(Pipelining)
Redis是一个使用客户端-服务器模型的TCP服务器,也被称为请求/响应协议。也就是说,redis每次执行一个请求,需要经过以下步骤:
- 客户端向服务器发送一个查询,然后从套接字读取数据,通常以阻塞的方式获取服务器的响应。
- 服务器处理命令并将响应发送回客户端。
如果现在有一堆命令等待执行,发送完一个请求,等待响应再发送下一个请求……就会造成时间上的浪费。所以,我们希望能够一次就发送多条命令,以节省时间。而管道就能帮助我们实现这一需求。
通过管道可以在无需等待请求被响应的情况下,发送下一个请求。并且,通过管道还可以对事务进行部分支持(不支持回滚)。
使用方法(通过python的redis库):
import redis
conn = redis.Redis("127.0.0.1", 6379)
pipe = conn.pipeline(transaction=True) # 参数代表使用事务
# 开启事务块
pipe.multi()
pipe.set('key', 'value')
# ......
# 执行事务块
pipe.execute()
五、在django中使用redis
django是不支持redis作为缓存的,但我们可以使用上面的redis库,也可以使用专门的django-redis库添加支持。下面简单说一下django-redis的使用方法。
安装django-redis:
pip install django-redis在项目配置文件中,配置CACHES后端:
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }LOCATION支持三种参数:创建一个正常的TCP套接字连接:
redis://[[username]:[password]]@localhost:6379/0;创建一个SSL封装的TCP套接字连接:
rediss://[[username]:[password]]@localhost:6379/0;创建一个unix domain套接字连接:
unix://[[username]:[password]]@/path/to/socket.sock?db=0。
如果有密码,在
OPTIONS中设置"PASSWORD":"密码"。使用方法有两种:
使用django提供的接口:
from django.core.cache import cache cache.set("key", value, timeout=30) cache.get("key", default="默认值")使用django-redis:
from django-redis import get_redis_connection conn = get_redis_connection("default") conn.hgetall("key")
更加详细的说明,请参考官方文档:传送门
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
猜你喜欢

day12---接口和协议

进程的创建

加速FinOps实践,为企业降本增效

Daily practice of PMP | Do not get lost in the exam-8.2 (including agility + multiple choice)

mysql的innodb存储引擎和myisam存储引擎的区别

mysql备份时的快照原理

"Swordsman Offer" brush questions print from 1 to the largest n digits

ceph简介

训练正常&异常的GAN损失函数loss变化应该是怎么样的

熊市中预言机,牛市中的战斗机,藏宝计划起飞,坐稳扶好!
随机推荐
mysql5.7服务器The innodb_system data file 'ibdata1' must be writable导致无法启动服务器
[Kaggle combat] Prediction of the number of survivors of the Titanic (from zero to submission to Kaggle to model saving and restoration)
推荐系统-排序层-特征工程:用户特征、物品特征
wordpress: 裁剪您的图片时发生错误
Fortify白盒神器20.1.1下载及安装(非百度网盘)
swiper分类菜单双层效果demo(整理)
Poke the myth of Web3?Poke the iron plate.
Oracle Rac Cluster File Directory Migration
ArcEngine(一)加载矢量数据
“唯一索引允许为空“ 的说法是不严谨的
解决移动端有纵向滚动条但是不能滚动的问题
面试介绍项目经验(转)
Eject stubborn hard drives with diskpart's offline command
002-字段不为null
How does Mysql query two data tables for the same fields in two tables at the same time
tolower函数
mysql服务器上的mysql这个实例中表的介绍
Haisi project summary
基于SSM开发的的小区物业管理系统小程序源码
sqlite date field plus one day