Redis缓存

文章目录

  • 一、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重启后,可以从磁盘上恢复数据。

持久化方式:RDB和AOF

七、其他资料

python redis-py模块使用详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值