文章目录
- 一、Redis介绍
- 特性:
- 优势:
- 应用场景:
- 二、安装启动
- 三、核心配置
- 3.1 核心配置
- 3.2 全局配置
- 3.3 setting配置
- 四、基本数据类型
- 4.0 五种基本数据结构
- 4.1 字符串string
- 4.2 哈希hash
- 4.3 列表list
- 4.4 集合set
- 4.5 有序集合sorted set
- 4.6 通用操作命令
- 五、Redis连接池
- 5.1 基础用法
- 5.2 redis.ConnectionPool与redis.BlockingConnectionPool区别
- 5.3 redis.Redis与redis.StrictRedis区别
- 六、缓存持久化
- 持久化方式:RDB和AOF
- 七、其他资料
一、Redis介绍
Redis是一个非关系型内存数据库(现在已经支持内存数据持久化到硬盘当中,重新启动时,会自动从硬盘进行加载),由于其性能极高,因此经常作为中间件、缓存使用。
特性:
- 非关系型数据库,不支持sql语法
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。(分为2种ROB模式和AOF模式)
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash,bitmaps,hyperloglog等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
优势:
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
(主要是由于完全基于内存操作,使用的是单线程,避免线程切换和竞态产生的消耗,基于非阻塞的IO复用机制,基于c语言做的数据结构优化) - 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的。
(原子性指的是Redis操作不可再分,支持单线程操作) - 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
应用场景:
- 用来做缓存(ehcache/memcached)——redis的所有数据是放在内存中的(内存数据库)
- 用户计数,记录点赞量,浏览量等
- 基于列表和有序集合等数据结构,能够搭建各种排行榜系统
- 可以在某些特定应用场景下替代传统数据库——比如社交类的应用
- 在一些大型系统中,巧妙地实现一些特定的功能:session共享、购物车
二、安装启动
-
安装: Linux环境下直接解压压缩包:Redis-x64-5.0.10.zip
-
django中应用redis,目前一般使用第三方库 django-redis
安装:pip install django-redis -
启动:redis-server (如果没有配置环境变量,到解压好的文件夹中启用)
-
连接redis数据库: redis-cli(另开一个终端!!!!)
三、核心配置
3.1 核心配置
在redis.conf下
bind 127.0.0.1 # 绑定IP:如果需要远程访问,可以将此注释,或绑定一个真是IP
port 6379 # 端口:默认为6379
logfile "Logs/redis_log.txt" # 日志文件
databases 16 # 数据库个数
3.2 全局配置
全局配置,即设置在settings最外层的配置项:
DJANGO_REDIS_LOG_IGNORED_EXCEPTIONS = True # 给所有缓存配置相同的忽略行为
DJANGO_REDIS_LOGGER = 'some.specified.logger' # 设置指定的 logger 输出日志, 需要设置logger
3.3 setting配置
CACHES = {
"default": { # default 是缓存名,可以配置多个缓存
"BACKEND": "django_redis.cache.RedisCache", # 应用 django-redis 库的 RedisCache 缓存类
"LOCATION": "redis://127.0.0.1:6379", # 配置正确的 ip和port
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient", # redis客户端类,可以设置一些特殊客户端类,例如
"CONNECTION_POOL_KWARGS": { # redis连接池的关键字参数
"max_connections": 100,
"timeout": 240, # 缓存的超时时间
"socket_timeout": 120,
"retry_on_timeout": True,
"socket_keepalive": True,
"health_check_interval": REDIS_HEALTH_CHECK_INTERVAL,
"db": config.REDIS_CACHE_DATABASE,
'socket_keepalive_options': {socket.TCP_KEEPIDLE: REDIS_TCP_KEEPIDLE,
socket.TCP_KEEPINTVL: REDIS_TCP_KEEPINTVL,
socket.TCP_KEEPCNT: REDIS_TCP_KEEPCNT}},
}
"PASSWORD": "123456", # 如果 redis 设置了密码,那么这里需要设置对应的密码
}
}
}
更多配置项:
LOCATION:
- 设置连接url,譬如:“redis://127.0.0.1:6379/0”,
- 如果要设置redis主从连接,设置列表:[“redis://127.0.0.1:6379/1”, “redis://127.0.0.1:6378/1”],第一个连接是 master 服务器
- 支持三种 URL scheme :
redis://: 普通的 TCP 套接字连接 - redis://[:password]@localhost:6379/0
rediss://: SSL 包裹的 TCP 套接字连接 - rediss://[:password]@localhost:6379/0
unix://: Unix 域套接字连接 - unix://[:password]@/path/to/socket.sock?db=0
但是密码放在url中,不是很安全,所以建议使用示例中的方式
OPTIONS:
-
TIMEOUT:
-缓存的超时时间,单位秒,默认是 300秒,如果为None,表示缓存永不超时,如果为0,表示缓存立刻超时,相当于不使用缓存 -
SOCKET_TIMEOUT:
连接建立后,读写超时时间,单位秒 -
SOCKET_CONNECT_TIMEOUT:
建立连接超时时间,单位秒 -
COMPRESSOR:
默认不使用压缩,指定压缩的类,譬如"django_redis.compressors.zlib.ZlibCompressor" -
IGNORE_EXCEPTIONS:
默认为False,当Redis仅用于缓存时,连接异常或关闭后,忽略异常,不触发异常,可以设置为True,也可以全局设置 DJANGO_REDIS_LOG_IGNORED_EXCEPTIONS=True -
PICKLE_VERSION:
序列化使用的是pickle,默认情况下使用最新的pickle版本,这里可以设置指定版本号(设置为 -1 也是指最新版本) -
CONNECTION_POOL_CLASS:
设置自定义的连接池类 -
PARSER_CLASS:
redis.connection.HiredisParser,可以这样设置,使用C写的redis客户端,性能更好 -
SERIALIZER:
设置序列化,如 “django_redis.serializers.json.JSONSerializer” -
CLIENT_CLASS:
设置一些特殊客户端类,譬如:
分片客户端:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": [
"redis://127.0.0.1:6379/1",
"redis://127.0.0.1:6379/2",
],
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.ShardClient", # ShardClient
}
}
}
集群客户端:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": [
"redis://127.0.0.1:6379/1",
],
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.HerdClient", # HerdClient
}
}
}
四、基本数据类型
4.0 五种基本数据结构
(字符串string、哈希hash、列表list、集合set、有序集合sorted set)
注意:
redis本质上一个key-value 数据库,首先key也是字符串类型,由于key不是binary safe的字符串,所以像“my key”和“mykey\n”这样包含空格和换行的key是不允许的。
4.1 字符串string
set key value # 设置key值和value值
get key # 根据指定key值获取value值, 若值不存在时返回nil
setex key seconds value # 设置key值的value秒后过期
setnx key value # 只有在key值不存在的时候才能设置,存在则无效。
mset k1 v1 k2 v2 # 同时新增多个键值对
mget k1 k2 # 同时获取多个键值对
msetnx k1 v1 k2 v2 # 同时设置多个键值对,所有键都不存在的情况下新增成功,有一个失败则全部失败
getrange key 0 3 # 获取key切片后的值,如key='abcde',结果为'abcd'
4.2 哈希hash
hset key field value # 添加或设置对应的哈希键值对
hget key field # 根据key和哈希的键获取值
hdel key field # 删除对应的哈希键值对
hkeys key # 获取哈希表中的所有键
hvals key # 获取哈希表中的所有值
4.3 列表list
lpush key value1 [value2] # 将一个或多个值插入列表
lrange key start stop # 获取指定范围内的元素
rpop key # 移除并获取列表最后一个元素
len key # 获取列表长度
4.4 集合set
sadd key member1 [member2] # 向集合添加一个或多个成员
smembers key # 返回集合中的所有成员
scard key # 获取集合的成员数
sinter key1 [key2] # 返回给定所有集合的交集
sunion key1 [key2] # 返回所有给定集合的并集
srem key member1 [member2] # 删除集合中一个或多个成员
4.5 有序集合sorted set
zadd key score1 member1 [score2 member2] # 向有序集合添加一个或多个成员
zrange key start stop [WITHSCORES] # 通过索引区间返回有序集合中指定区间内的成员
zincrby key increment member # 有序集合中对指定成员的分数加上增量 increment
zrem key member [member ..] # 移除有序集合中的一个或多个成员
4.6 通用操作命令
keys * # 查看当前库所有的key
keys pattern # 查找所有符合给定惯式(patern)的key
exists key # 检查给定 key 是否存在
type key # 返回 key 所储存的值的类型
del key # 该命令用于在key存在且删除这个key
expire key 秒钟 # 为指定的key设置过期时间
ttl key # 查看指定key还有多少秒过期,-1表示永不过期,-2表示已过期
move key dbindex [0-15] # 将当前的数据库的key移动到给定的数据库db中。redis中有16个数据库,不指定默认使用0号数据库
select dbindex # 切换数据库,默认为0号数据库
dbsize # 查看当前数据库key的数量
flushdb # 清空当前库
flushall # 清空所有库
五、Redis连接池
- 介绍:
首先Redis也是一种数据库,它基于C/S模式,因此如果需要使用必须建立连接,稍微熟悉网络的人应该都清楚地知道为什么需要建立连接,C/S模式本身就是一种远程通信的交互模式,因此Redis服务器可以单独作为一个数据库服务器来独立存在。
假设Redis服务器与客户端分处在异地,虽然基于内存的Redis数据库有着超高的性能,但是底层的网络通信却占用了一次数据请求的大量时间,因为每次数据交互都需要先建立连接,假设一次数据交互总共用时30ms,超高性能的Redis数据库处理数据所花的时间可能不到1ms,也即是说前期的连接占用了29ms,连接池则可以实现在客户端建立多个链接并且不释放,当需要使用连接的时候通过一定的算法获取已经建立的连接,使用完了以后则还给连接池,这就免去了数据库连接所占用的时间。 - Redis连接池可以理解为对Redis连接的缓存,主要用于优化连接的开销和维护负载均衡等方面。连接池的主要作用是维护一定数量的连接资源,减少Redis连接频繁建立和断开的损耗。
5.1 基础用法
import redis
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, max_connections=10) # 通过ConnectionPool函数创建一个Redis连接池
# host参数指定Redis的主机地址,port参数指定Redis的端口号,db参数指定Redis的数据库编号,max_connections参数指定连接池的最大连接数。
conn = redis.Redis(connection_pool=pool) # 获取Redis连接池的一个连接
conn.set('key', 'value') # 写入数据
value = conn.get('key') # 读取数据
pool.release(conn) # 使用完Redis连接后将连接归还至连接池,以便其他代码复用
5.2 redis.ConnectionPool与redis.BlockingConnectionPool区别
redis-py中提供了多种连接池以满足实际需求,
阻塞连接池(BlockingConnectionPool)操作Redis的特点是:当连接池中没有空闲的连接时,会等待timeout秒,直到获取到连接或超时报错。
非阻塞的连接池(BlockingConnectionPool 类)
BlockingConnectionPool是一个线程安全的非阻塞连接池。其基本使用和普通的连接池一致,只不过在其内部重新实现了对连接池的管理。
其连接池中默认的连接数量为50;并且增加了一个timeout参数,其默认值为20,当其设置为None代表无限等待下去。
当连接池中的连接全部被使用时,其不会直接报错,而是会最多等待timeout秒,若还是没有可用连接,则会报错。
在BlockingConnectionPool类,连接默认采用LifoQueue即队列维护,这个队列就是连接池。
5.3 redis.Redis与redis.StrictRedis区别
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,
StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令(比如,SET命令对应与StrictRedis.set方法)。
Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。
简单说,官方推荐使用StrictRedis方法。
pool = redis.StrictRedis(host=‘localhost’, # Redis服务器的主机名或IP地址
port=6379, # 指定Redis服务监听的端口号,默认6379
db=0, # Redis数据库的编号,默认为0
password=None, # Redis服务器的密码,如果服务器需要密码验证
max_connections=2, # 连接池中维持的最大连接数,默认为2。
min_connections=None, # 连接池中维持的最小连接数,默认为None。
timeout=360, # 客户端连接的超时时间。若客户端在此时间内未发送命令,则自动断开连接。默认timeout=0,表示永不超时。
socket_timeout=None, # Redis发出命令接收响应的时间不能超过此参数设置时间,超过将会抛出异常。
retry_on_timeout=False, # 默认为False,当设置False时, 一个命令超时后, 将会直接抛出timeout异常。当设置为True时, 命令超时后,将会重试一次, 重试成功则正常返回; 失败则抛出timeout异常。
socket_keepalive=False, # 默认为False
health_check_interval=0, # 健康检测间隔时间
socket_keepalive=False, # 是否启用TCP keepalive机制
socket_keepalive_options, # TCP keepalive参数
connection_pool=None, # Redis连接池,默认使用ConnectionPool
charset=‘utf-8’, # 已废弃,作用等同encoding
errors=‘strict’, # 已废弃,作用等同encoding_errors
decode_responses=False, # 是否对返回解码
unix_socket_path=None) # 以本地socket方式连接时,socket文件路径
六、缓存持久化
redis的数据都存在内存中,没有配置持久化的话,数据就会全部丢失,于是需要开启redis的数据持久化功能,将数据保存在磁盘上,当redis重启后,可以从磁盘上恢复数据。