打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
redis学习笔记
一、Redis特点|应用场景|数据类型
1)Redis特点
* 基于内存,并且支持持久化的磁盘;
* 基于key-value的非关系型数据库;
* 关系型数据库:Oracle、MySQL、mariadb
* 非关系型数据库:Redis、MongoDB
* 五大数据类型,存储各种类型的数据(字符串、列表、哈希、集合、有序集合);
* 核心语句是单进程单线程。
2)应用场景
作为缓存;并发计数(**INCR DECR**);排行榜;任务队列(**生产者消费者模型**)
3)Redis和MySQL和MongoDB
* MySQL是基于磁盘关系型数据库,数据以二维表形式存储;
* Redis和MongoDB是非关系数据库,数据以键值对方式存储;
Redis数据基于内存,数据类型丰富;
MongoDB数据基于磁盘,数据类型单一,值为JSON文档;
* MySQL和MongoDB
MySQL结构:库    --    表  --  表记录
MongoDB:  库    --    集合  -- 文档
MongoDB无需建库建集合,使用时会自行创建。
* 端口
MySQL端口:3306
Redis端口:6379
MongoDB端口:27017
4)数据类型
1. 字符串:{"name": "maria"}
2. 列表:{"teachers": ["qds", "maria"]}
3. 哈希:{"ying_info": {"ying_fans":666,"ying_nums":888}}
4. 集合
5. 有序集合
二、关于Redis
1)启动和连接
* 服务端启动:sudo /etc/init.d/redis-server start
* 客户端连接:redis-cli -h IP地址 -p 6379 -a 密码
redis-cli
2)配置文件和常见配置
* 配置文件:/etc/redis/redis.conf
* 常规配置:后期任何服务只要更新配置文件,则一定要重启服务或者重载服务才能生效。
* 设置连接密码:requirepass 密码
* 允许远程链接
1、注释本地IP地址绑定:68行 #bing 127.0.0.1  ::1
2、关闭保护模式(把yes改为no)protected_mode no
3、重启服务
3)启动文件|配置文件|日志文件
3.1 启动文件 /etc/init.d/
1.mysql: /etc/init.d/mysql
2.Redis: /etc/init.d/redis-server
3.Nginx: /etc/init.d/nginx
3.2 配置文件 /etc/服务名
1.mysql: /etc/mysql/mysql.conf.d/mysqld.cnf
2.Redis: /etc/redis/redis.conf
3.Nginx: /etc/nginx/nginx.conf
3.3 日志文件 /var/log/服务名
1.mysql: /var/log/mysql/xxx.log
2.Redis: /var/log/redis/xxx.log
3.Nginx: /var/log/nginx/xxx.log
三、Redis命令
1)通用命令
1. 切换库:SELECT index  index:0 - 15,db0~db15
2. 查看所有的key:KEYS *
3. 查看类型:TYPE key
4. 删除key:DEL key
5. 清除当前库所有数据:FLUSHDB
6. 清除所有库所有数据:FLUSHALL
7. 查看key存活时间:TTL key
8. 删除过期:persist key
2)字符串
应用场景:常规计数(点赞数、评论数)、存储短信验证码、缓存热点数据(热门商品|文章)。
1. 设置:set key value nx ex seconds  nx:key不存在时进行设置,ex:设置过期时间
2. 获取值:get key
3. 数值操作:
数值+1:incr key
数值-1:decr key
浮点型操作:incrbyfloat key increment
3)列表
应用场景:任务队列|消息队列,生产者消费者模型,Redis充当消息队列的作用,用来存储任务。(key:表名)
1. 从列表头部/尾部压入元素:LPUSH|RPUSH key element
2.从列表头部/尾部,阻塞弹出,列表为空时阻塞: BLPOP/BRPOP key timeout
从列表头部/尾部弹出1个元素:LPOP/RPOP key
timeout为0时代表永久阻塞,直到有元素可以弹出。
3. 查看列表中元素:LRANGE key start stop
4. 查看列表长度:LLEN key
注意:LPUSH + BRPOP组合经常用作消息队列,消息入队列LPUSH,消息出队列BRPOP。
5. 在制定元素前/后添加元素: LINSERT Key after/before value newvalue
6. 从列表src尾部弹出1个元素,押人员列表dst的头部:RPOPLPUSH src dst
7. 删除指定元素:LREM key count value
8. 保留指定范围元素:LTRIM key start stop
4)哈希
哈希散列数据类型适合存储对象类型的数据(对象ID作为key,属性名作为Field,属性值作为value),类似python的字典。
应用场景1:用户不同维度数据统计;比如:关注数、粉丝数、点赞数、评论数(比如用户ID作为key、不同的维度作为field、具体的数值作为value)。
应用场景2:存储购物车数据(用户ID作为key,商品ID作为Field,商品数量和选中状态作为value)。
1. 设置:HSET  key  field  value  field  value
2. 查看指定字段:HGET  key  field
3. 获取所有键值对:HGETALL  key
4. 字段值整数/浮点增量运算:HINCRBY/HINCRBYFLOAT  key  field  increment
5. 删除指定字段:HDEL  key  field
6. 获取长度:HLEN key
7. 判断字段是否存在:HEXISTS key field
9. 返回所有字段名:HKEYS key
5)集合(set)
应用场景1:利用集合的交集获取共同关注、共同好友。
应用场景2:增量爬虫,利用Redis的集合存储每个请求的指纹,利用sadd()的返回值确定是否为新更新数据。返回值为0,为之前抓取过的数据
1. 添加成员:SADD  key(集合)  member(元素)  member   #例如SADD user liying
2. 查看成员:SMEMBERS  key
3. 查看长度:SCARD  key
4. 弹出成员:SPOP  key  [count]     #默认1个
5. 交集:SINTER key1 key2      #实现共同关注、共同好友
结果保存到新的集合中:SINTERSTORE 新集合key1 key2
6. 差集:SDIFF key1 key3
结果保存到新的集合中:SDIFFSTORE 新集合key1 key2
7. 并集:SUNION key1 key2
结果保存到新的集合中:SINTERSTORE 新集合key1 key2
8. 删除元素:SREM key member1 member2 ...
6)有序集合
应用场景:各种排行榜。成员不允许重复,每个成员有关联的浮点数的分值。
1. 添加成员:ZADD  key(集合)  score(值)  member(元素)  score  member 。。。
Python:r.zadd(key, {"member":score, "member":score})
2. 升序/降序查看成员:ZRANGE/ZREVRANGE  key  start  stop [withscores]
例子:zrange z1 0 -1 withscores
python: r.zrange(key, start, stop, withscores=True|False)
3. 查看指定元素的值:zscore key member
查看区间值(分页):zrangebyscore key min max [withscores] [limit offset count]
min max :取值区间的最小与最大值,开区间需要在值前面加小括弧(
Offset 跳过数量 count 查询的数量
例如:zrangbyscore z1 30 (50 withscores limit 1 3  #查z1中分值30-50之间(不包含50),排名第2,3,4名(跳过第一名,取3个成员)
4. 查看长度:ZCARD  key
5. 返回某个成员排名-升序/降序排列:ZRANK/ZREVRANK  key  member
6. 并集:ZUNIONSTORE  目标集合  集合数  key  [key, ...]  [weights]  [AGGREGATE SUM|MAX|MIN]
说明:zunionstore  zs3  2  zs1  zs2  weights  0.5  0.6  aggregate  sum
python: r.zunionstore("目标集合", {"key1":权重, "key2":权重}, aggregate="MAX|MIN|SUM")
7. 并集:ZINTERSTORE  key  numkeys  key  [key, ...]  [weights]  [AGGREGATE SUM|MAX|MIN]
python: r.zinterstore("目标集合", {"key1":权重, "key2":权重}, aggregate="MAX|MIN|SUM")
8. 删除:zrem key member
删除区间:zremrangbyscore key min max
四、数据持久化
1)意义
为了数据安全,防止丢失;数据持久化是将内存中的数据保存到磁盘中一份,用于数据备份和数据恢复;当Redis服务重启或者主机宕机重启时,Redis会自动将磁盘的数据恢复到内存中。
2)方式
两种方式:RDB模式、AOF模式。如果两种备份模式都开启,那数据恢复时优先找AOF的文件恢复。
2.1 RDB模式
默认开启,备份的是全部数据,也就是全量备份,会消耗更多内存资源,所以不能高频备份,可能造成数据的丢失,丢失数据的量不确定。 数据恢复时只需将磁盘中的数据恢复到内存中一份,效率高。
* RDB备份策略:/var/lib/redis/dump.rdb
307  save 900 1  #当时间过去900秒,且数据发生一次以上更改时,会自动全量备份。
308  save 300 10
309  save 60 10000
2.2 AOF模式
通过修改配置文件开启,备份的是命令。每次只备份新增的命令,也就是增量备份,相比较来说更加节约内存,所以可以高频备份,也会丢失数据,但是最多丢失1秒钟的数据!数据恢复时需要执行大量的Redis命令,效率低。
* AOF备份策略:
开启:/var/lib/redis/appendonly.aof   -->  appendonly yes
1. appendonlyfsync always   #服务器每写一条命令就备份一次,基本不丢失数据
2. appendonlyfsync everysec  #最多丢失一秒钟的数据
3. appendonlyfsync no        #丢失数据的数量不一定
* AOF文件自动重写(避免aof文件里面产生冗余命令)策略:
64MB重写、128M重写、256M重写... ...
1165  auto-aof-rewrite-percentage 100  #增量百分比
1166  auto-aof-rewrite-min-size 64mb   #
restart  停机重启
force-reload  不停机,重新加载配置文件
五、主从加哨兵
1)说明
哨兵sentinel会不断的检查Master和Slaves是否正常,一旦master挂掉,会从slaves中提升一个新的主,并将其他的从设置为新的主的从。每个哨兵可以监控任意多个Master和该Master下面的Slaves。
* 主:master,负责读写数据,并且将数据同步给从服务器。
* 从:slave,负责读数据,不能写数据,减轻master的读压力。
2)安装
sudo apt install redis-sentinel
3)主从哨兵环境搭建
* 环境说明
1. 主:6379 :sudo /etc/init.d/redis-server start
2. 从:6380  6381
* redis-server --port 6380
* redis-server --port 6381
* 6380> SLAVEOF 127.0.0.1 6379       #设置为谁的从  slaveof  ip  port
* 6381> SLAVEOF 127.0.0.1 6379   #取消主从  slaveof  no  one
* 搭建哨兵
1. 创建哨兵配置文件(任意路径):sentinel.conf
port 26363(哨兵端口号-自定义)
sentinel monitor 服务名(自定义) master-ip master-port 投票数
2. 启动哨兵
redis-sentinel sentinel.conf
* 测试
1. 将主服务停止,观察哨兵日志:sudo /etc/init.d/redis-server stop
主挂掉后,哨兵会搭建新的主从结构来处理客户都安请求。
2. 将主服务启动,观察哨兵日志:sudo /etc/init.d/redis-server start
原来主启动后,作为新的主从结构中的从。
六、缓存使用django-redis
中文文档:https://blog.51cto.com/u_15054050/4052558
setting.py的配置:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
views的使用:
from django.core.cache import caches
from django_redis import get_redis_connection
#调用缓存API
# 1.存入缓存
caches["default"].set(key, value, expire)
# 2.获取数据
caches["index"].get(key)
# 3.删除指定key
caches["detail"].delete(key)
# 4.清除当前库:FLUSHDB
caches["sms"].clear()
#调用django-redis 操作更复杂的数据类型
#列表、哈希、集合、有序结合
r = get_redis_connection()
# 1.在集合中添加成员
r.sadd(key, member)
# 2.查看集合中的所有成员
r.smemebers(key)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
这次彻底读透 Redis !
狂神说Java——Redis最全教程
从入门到精通-Redis,图文并茂、分布式锁、主从复制、哨兵机制、Cluster集群、缓存击穿、缓存雪崩、持久化方案、缓存淘汰策略 附案例源码
如何从0到1构建一个稳定、高性能的Redis集群?(附16张图解)
简明实用:Redis 高级特性与案例介绍
关于Redis的一些常识
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服