django-redis 中文文档
django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cache/session 后端的全功能组件
Django 使用 django-redis 作为缓存的正确用法
菜鸟redis 教程
纯静态页面
读取了数据库信息,但是不经常变动的页面,比如文章热门排行榜,这个调用数据库信息并且还要排序的完全可以使用缓存,因为不需要实时展现最新的
HTML 的片段,比如整个页面都经常变动,但是有个侧边栏不经常变动,就可以缓存侧边栏
需要使用复杂逻辑生成的 HTML 片段,使用缓存可以减少多次重复操作
因为缓存直接是从内存读取,极大的节省时间,另外也可以对于复杂数据生成可以做到每隔比如十分钟更新一次,如果每次请求都运行计算,那么后台有可能直接卡掉了。这一点可以用在抖音视频接口上,比如由用户刷新,改为后台刷新。返回地址读完后再重新请求,这个要好好搞一下
redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
-
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存
安装忽略
Redis 配置
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)
查看和设置 redis 配置 项:
命令 CONFIG
- 查看配置项: CONFIG get
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
redis 127.0.0.1:6379> CONFIG GET * # 查看所有配置项
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
# 注意 一行是 名称,一行是对应的值
- 编辑配置
CONFIG set
格式:
CONFIG SET 配置项名 值
CONFIG SET loglevel "notice"
配置参数说明
daemonize no # 使用 yes 启用守护进程,windows 只能为 no
(ps 守护进程,启动shell 关闭,启动的服务依然会后台运行)
pidfile /var/run/redis.pid # Redis 以守护进程方式运行 pid 写入 的文件
port 6379 # 监听端口
bind 127.0.0.1 # 绑定的主机地址
timeout 300 # 客户端闲置多久关闭连接 ,如果指定为 0,表示关闭该功能
loglevel notice # 日志级别 ,支持四个级别:debug、verbose、notice、warning,默认为 notice
logfile stdout # 日志输出,默认为控制台, 守护进程运行,则日志将会发送给 /dev/null
databases 16 # 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
save # 指定多长时间内,有多少条操作就将数据同步到数据库
Redis 默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个
更改以及 60 秒内有 10000 个更改。
rdbcompression yes # 保存到本地数据库是否要进行压缩,默认 LZF 压缩,
# 会增加cpu使用,,不压缩数据会很大,综合考虑吧
dbfilename dump.rdb # 指定本地数据库文件名,默认值为 dump.rdb
dir ./ # 本地数据库存放目录
requirepass foobared # 设置 Redis 连接密码,
# 如果配置了连接密码 客户端在连接 Redis
# 时需要通过 AUTH 命令提供密码,默认关闭
maxclients 128 # 设置同一时间最大客户端连接数 0 为不限制 同 sokcet `的listen(128)
maxmemory # 指定 Redis 最大内存限制,
# Redis 在启动时会把数据加载到内存中,达到最大内存后,
#Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,
# 仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取
# 操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区
appendonly no # 指定是否在每次更新操作后进行日志记录,默认不开启
appendfilename appendonly.aof # 日志名 默认为 appendonly.aof
appendfsync everysec # 指定更新日志条件,共有 3 个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用 fsync() 将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折中,默认值)
vm-max-threads 4 # 访问swap文件的线程数 ,默认为4
include /path/to/local.conf # 指定包含其它的配置文件,可以在同一主机上多
# 个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自
# 己的特定配置文件
redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
- string
是redis最基本的类型了,可以包含二进制图片等数据。(可以认为可以包含任何数据)
string 类型的值最大能存储 512MB。 - Hash(哈希 字典 )
存储、读取、修改用户属性
Redis hash 是一个键值(key=>value)对集合。特别适合存储对象数据类型
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"
HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个hash 存储的键值对是无限制的
- List(列表 双向链表结构)
1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
简单的字符串列表。按照插入顺序排列。也可以指定插入头或尾
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
列表存储的数据默认无限制
- Set(集合 )
共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
set 是字符串的无序集合,
集合是通过哈希表实现 ,取值复杂度为 O(1)
sadd 添加一个set 元素
sadd key member
# 添加一个 string 元素到 key 对应的 set 集合中,
成功返回 1,如果元素已经在集合中返回 0。并且忽略插入
set 元素个数 无限制 (无限制即 40 亿个 )
- zset(sorted set:有序集合)
1、排行榜 2、带权重的消息队列
基本和set 类似,元素都不会重复,到那时zset 会对元素进行排序
zadd 命令 添加一个zset 元素
redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"
由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。
数据库 名为 数字编号 ,不支持自定义名字
每个数据库对外都是一个从0开始的递增数字命名,默认连接 0 ,选择数据库使用 select 如 SELECT 1
Redis 命令
客户端命令 :
$ redis-cli
连接本地 :
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
# 在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。
连接远程:$ redis-cli -h host -p port -a password
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG
Redis 键(key) 命令
key 命令 用于管理 redis 的key
格式 : COMMAND key_name
如:
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1
如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0
所有命令
DEL key key 存在时,删除key
DUMP key 序列化给定 key ,并返回被序列化的值。
EXISTS key检查 key 是否存在
EXPIRE key seconds 设置key 过期时间 秒 计
KEYS pattern 找出所有符合 pattern 的 key
MOVE key db 把key 移到给定的数据库db
PERSIST key 移除key的过期时间
TTL key 返回秒单位的key 剩余过期时间
更多命令参考:
https://redis.io/commands
Redis 字符串命令(String)
SET key value
设置key 的值
GET key
获取指定key 的值
GETRANGE key start end
返回 key 对应字符串的子字符串
GETSET key value
给 key 设置指定的值,并且返回旧的值
GETBIT key offset
对字符串的值偏移一定位,然后返回偏移量上的位
MGET key1 [key2..]
获取一个或多个key 的值
SETBIT key offset value
设置或清除指定位的值
SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
SETNX key value
key不存在时,设置key 的值
SETRANGE key offset value
用 value 覆盖给定key 偏移后面 的值
STRLEN key
获得key字符传的长度
MSET key value [key value ...]
同时设置一个或多个key 对应的值
MSETNX key value [key value ...]
同时设置多个key 的值,当key 都不存在 时
PSETEX key milliseconds value
同 SETEX ,只不过是以毫秒为单位
INCR key
key 中存储的数字,加1
INCRBY key increment
key 中存储的值 加上给定的增量值
INCRBYFLOAT key increment
key 中存储的值 加上给定的增量浮点值
DECR key
将 key 中储存的数字值减一。
DECRBY key decrement
key 所储存的值减去给定的减量值
APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾
更多命令请参考:https://redis.io/commands
Redis 哈希(Hash)
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
可以看出就像设置,字典一样
我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。
哈希表命令:
HDEL key field1 [field2]
删除一个后者多个哈希表的字段
HEXISTS key field
查看哈希表指定 字段 是否存在
HGET key field
查看哈希表指定字段的值
HGETALL key
获取所有字段和值
HINCRBY key field increment
给指定字段的整数值 加上 增量 increment
HINCRBYFLOAT key field increment
字段的浮点值加 increment
HKEYS key
获取哈希表的所有字段
HLEN key
获取哈希表 字段的数量
HMGET key field1 [field2]
获取指定字段的值
HMSET key field1 value1 [field2 value2 ]
同时设置多个字段的值 (会覆盖指定的值,哈希表不存在,则创建)
HSET key field value
设置一个字段的值
HSETNX key field value
只有在 字段不存在时,设置值
HVALS key
获取所有字段的值
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对。
Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10
1) "mysql"
2) "mongodb"
3) "redis"
在以上实例中我们使用了 LPUSH 将三个值插入了名为 runoobkey 的列表当中。
Redis 列表命令
BLPOP key1 [key2 ] timeout
移除并获取列表第一个值,没有元素则等待超时时间以内
BRPOP key1 [key2 ] timeout
移除并获取列表最后一个元素
BRPOPLPUSH source destination timeout
弹出一个元素并加到另一个列表(左边),并返回它。无值则等超时
LINDEX key index
索引获取元素(可 -1 表示最后一个,类推)
LINSERT key BEFORE|AFTER pivot value
在指定的元素前 或 后 插入元素
LLEN key
获取列表长度
LPOP key
移除并获取列表第一个元素
LPUSH key value1 [value2]
插入多值到表头
LPUSHX key value
已存在的表 头加一个值 返回列表长度 (列表不存在时操作无效)
LRANGE key start stop
获取指定范围的值
LREM key count value
移除列表的值(移除数量为 +-count 值是value 的值,正数左边开始,负数右边开始,0 移除所有)
LSET key index value
通过索引设置元素的值
LTRIM key start stop
只保留范围内的值,其他删掉
RPOP key
移除最后一个值,并返回它
RPOPLPUSH source destination
移除最后一个值,并加到另外一个列表(头),并返回它
RPUSH key value1 [value2]
从右边插值
RPUSHX key value
已存在右边插入一个值 (返回列表长度)
-
Redis 集合(Set)
不重复的string集合
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
最多40亿个成员
实例:
redis 127.0.0.1:6379> SADD runoobkey redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey
1) "mysql"
2) "mongodb"
3) "redis"
1 代表执行正确
Redis 集合命令
向集合添加一个或多个成员
SADD key member1 [member2]
获取集合的成员数
SCARD key
返回给定所有集合的差集
SDIFF key1 [key2] |
返回给定所有集合的差集并存储在 destination 中
SDIFFSTORE destination key1 [key2]
返回给定所有集合的交集
SINTER key1 [key2]
返回给定所有集合的交集并存储在 destination 中
SINTERSTORE destination key1 [key2]
判断 member 元素是否是集合 key 的成员
SISMEMBER key member
返回集合中的所有成员
SMEMBERS key
将 member 元素从 source 集合移动到 destination 集合.
SMOVE source destination member
移除并返回集合中的一个随机元素
SPOP key
返回集合中一个或多个随机数.
SRANDMEMBER key [count]
移除集合中一个或多个成员
SREM key member1 [member2]
返回所有给定集合的并集
SUNION key1 [key2]
所有给定集合的并集存储在 destination 集合中
SUNIONSTORE destination key1 [key2]
迭代集合中的元素
SSCAN key cursor [MATCH pattern] [COUNT count]
-
Redis 有序集合(sorted set)
https://www.runoob.com/redis/redis-sorted-sets.html
和set 一样,
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
略