为了账号安全,请及时绑定邮箱和手机立即绑定

Redis缓存资料入门指南

标签:
NoSql Redis
概述

本文详细介绍了Redis缓存资料,包括Redis的基本概念、主要特点、应用场景以及安装配置方法。文章还涵盖了Redis的常用命令、数据结构详解、缓存策略设计以及实用的工具和客户端示例。

Redis简介
Redis是什么

Redis(REmote DIctionary Server)是一个开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种数据结构类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。Redis具有快速读写速度,支持持久化,同时支持事务、发布/订阅等高级功能。

Redis的主要特点
  • 内存中的数据存储:Redis将数据存储在内存中,这使得读写速度非常快。然而,由于内存成本相对较高,Redis通常只用于缓存或存储相对较小的数据集。
  • 持久化:Redis支持两种持久化方式:RDB和AOF。RDB(Redis Database Backup)通过在指定时间间隔中将内存中的数据快照写到磁盘来持久化数据。AOF(Append Only File)通过日志的形式来记录每个写操作,追加到文件中,恢复时再执行这些写命令。
  • 支持多种数据结构:Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。
  • 高性能:由于数据存储在内存中,Redis提供了非常高的读写性能。
  • 主从复制:支持多个数据库实例间的主从复制,实现数据的同步。
  • 事务支持:Redis支持事务,可以保证一组命令的原子性执行。
  • 发布/订阅:支持发布/订阅模式,可以实现消息的实时通信。
Redis的应用场景
  • 缓存加速:Redis可以用作缓存服务器,用于加速数据库查询、API响应等,减少对后端数据库的直接访问。
  • 会话存储:可以用来存储用户会话,由于数据存储在内存中,读取速度很快。
  • 计数器:Redis支持原子性操作,可以用于实现高并发的计数器。
  • 排行榜:利用有序集合(Sorted Set)可以很容易地实现排行榜功能。
  • 消息队列:结合发布/订阅功能,可以实现简单的消息队列系统。
Redis安装与配置
Windows环境下安装Redis
  1. 下载Redis Windows版本的压缩包,可以从官方GitHub页面获取。
  2. 解压压缩包,将解压后的文件夹放置在一个合适的位置,例如:C:\redis
  3. 打开命令行窗口,切换到解压后的文件夹路径下。
  4. 运行 Redis 服务,执行命令:redis-server.exe redis.windows.conf
# 下载并解压Redis Windows版本
# 将解压后的文件夹放置在C:\redis
cd C:\redis
# 启动Redis服务
redis-server.exe redis.windows.conf
  1. 打开浏览器,访问http://localhost:8000,可以看到Redis信息页面。
Linux环境下安装Redis
  1. 更新软件包列表:

    sudo apt-get update
  2. 安装Redis:

    sudo apt-get install redis-server
  3. 启动Redis服务:

    sudo systemctl start redis
  4. 查看Redis服务状态:

    sudo systemctl status redis
  5. 配置文件路径:/etc/redis/redis.conf(Linux)或redis.windows.conf(Windows)。
    可以编辑该配置文件以更改Redis的配置。

  6. 停止Redis服务:
    sudo systemctl stop redis
Redis配置文件详解

配置文件路径:/etc/redis/redis.conf(Linux)或redis.windows.conf(Windows)。

  • 监听的IP地址

    bind 127.0.0.1

    该配置表示只允许本地访问Redis服务器。要允许外部访问,可以将bind 127.0.0.1修改为bind 0.0.0.0

  • 端口号

    port 6379

    默认情况下,Redis服务监听在6379端口。

  • 日志级别

    loglevel verbose

    可以设置日志级别,verbose表示详细日志。

  • 数据库数量

    databases 16

    Redis默认配置支持16个数据库,可以修改该配置来改变数据库数量。

  • 持久化配置

    save 900 1
    save 300 10
    save 60 10000

    save配置表示在多长时间之内有多少写入操作,则可以触发一次持久化。比如save 900 1表示900秒内有1次写入操作,会触发一次持久化。

  • RDB持久化配置

    save 900 1
    save 300 10
    save 60 10000
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir ./data

    RDB持久化配置,保存到./data/dump.rdb文件中。

  • AOF持久化配置

    appendonly no
    appendfilename appendonly.aof
    appendfsync everysec

    appendonly控制是否启用AOF持久化,appendfilename设置AOF文件名。

  • 内存限制
    maxmemory 128mb
    maxmemory-policy allkeys-lru

    maxmemory设置最大内存使用量,maxmemory-policy设置内存使用策略,allkeys-lru表示使用最近最少使用的策略。

Redis常用命令介绍
Key操作命令
  • DEL:删除一个或多个键

    DEL key1 key2
  • EXISTS:检查给定键是否存在

    EXISTS key
  • TYPE:返回键所存储的数据类型

    TYPE key
  • KEYS:查找所有符合给定模式的键

    KEYS pattern
  • RENAMENX:如果目标键不存在,将源键重命名为目标键
    RENAMENX key src newkey
String操作命令
  • SET:设置键的值

    SET key value
  • GET:获取键的值

    GET key
  • INCR:将键的值增加1

    INCR key
  • DECR:将键的值减少1

    DECR key
  • STRLEN:返回键的值的长度
    STRLEN key
Hash操作命令
  • HSET:设置哈希表字段的值

    HSET key field value
  • HGET:获取哈希表字段的值

    HGET key field
  • HGETALL:获取哈希表中的所有字段和值

    HGETALL key
  • HINCRBY:将哈希表字段的值增加指定的整数值

    HINCRBY key field increment
  • HDEL:删除哈希表字段
    HDEL key field
List操作命令
  • LPUSH:将一个或多个值插入到列表头部

    LPUSH key value1 value2
  • LPOP:移除并获取列表头部的元素

    LPOP key
  • LRANGE:获取列表指定范围内的元素

    LRANGE key start stop
  • LLEN:获取列表的长度

    LLEN key
  • LSET:将列表指定索引位置的元素设为值
    LSET key index value
Set操作命令
  • SADD:向集合添加一个或多个成员

    SADD key member1 member2
  • SMEMBERS:获取集合中的所有成员

    SMEMBERS key
  • SPOP:移除并获取集合中的一个随机成员

    SPOP key
  • SCARD:获取集合的成员数

    SCARD key
  • SISMEMBER:查看成员是否是集合的成员
    SISMEMBER key member
Sorted Set操作命令
  • ZADD:向有序集合添加一个或多个成员,或者更新已存在成员的分数

    ZADD key score member
  • ZRANGE:通过分数范围来获取有序集合成员

    ZRANGE key start stop
  • ZREVRANGE:通过分数范围来获取反向有序集合成员

    ZREVRANGE key start stop
  • ZREVRANK:获取成员在有序集合中的排名(由大到小)

    ZREVRANK key member
  • ZCARD:获取有序集合的成员数
    ZCARD key
Redis数据结构详解
String类型详解
  • SET:设置键的值
    SET key "Hello, Redis!"
  • GET:获取键的值

    GET key
  • STRLEN:返回键的值的长度

    STRLEN key
  • INCR:将键的值增加1

    INCR key
  • DECR:将键的值减少1

    DECR key
  • INCRBY:将键的值增加指定的整数值

    INCRBY key 5
  • DECRBY:将键的值减少指定的整数值

    DECRBY key 5
  • MSET:同时设置多个键的值

    MSET key1 "value1" key2 "value2"
  • MGET:返回多个键所存储的值
    MGET key1 key2
Hash类型详解
  • HSET:设置哈希表字段的值

    HSET key "field" "value"
  • HGET:获取哈希表字段的值

    HGET key "field"
  • HGETALL:获取哈希表中的所有字段和值

    HGETALL key
  • HINCRBY:将哈希表字段的值增加指定的整数值

    HINCRBY key "field" 5
  • HDEL:删除哈希表字段

    HDEL key "field"
  • HKEYS:获取哈希表中的所有字段

    HKEYS key
  • HVALS:获取哈希表中的所有值
    HVALS key
List类型详解
  • LPUSH:将一个或多个值插入到列表头部

    LPUSH key "value1" "value2"
  • LPOP:移除并获取列表头部的元素

    LPOP key
  • LRANGE:获取列表指定范围内的元素

    LRANGE key 0 10
  • LLEN:获取列表的长度

    LLEN key
  • LSET:将列表指定索引位置的元素设为值

    LSET key 0 "newvalue"
  • LTRIM:将列表裁剪为指定范围

    LTRIM key 0 10
  • RPOP:移除并获取列表尾部的元素

    RPOP key
  • LINDEX:返回列表中指定索引位置的元素
    LINDEX key 0
Set类型详解
  • SADD:向集合添加一个或多个成员

    SADD key "member1" "member2"
  • SMEMBERS:获取集合中的所有成员

    SMEMBERS key
  • SPOP:移除并获取集合中的一个随机成员

    SPOP key
  • SCARD:获取集合的成员数

    SCARD key
  • SISMEMBER:查看成员是否是集合的成员

    SISMEMBER key "member1"
  • SREM:删除集合中的指定成员

    SREM key "member1"
  • SUNION:获取所有给定集合的并集

    SUNION key1 key2
  • SINTER:获取所有给定集合的交集
    SINTER key1 key2
Sorted Set类型详解
  • ZADD:向有序集合添加一个或多个成员,或者更新已存在成员的分数

    ZADD key 1 "member1"
  • ZRANGE:通过分数范围来获取有序集合成员

    ZRANGE key 0 10
  • ZREVRANGE:通过分数范围来获取反向有序集合成员

    ZREVRANGE key 0 10
  • ZREVRANK:获取成员在有序集合中的排名(由大到小)

    ZREVRANK key "member1"
  • ZCARD:获取有序集合的成员数

    ZCARD key
  • ZINCRBY:将有序集合成员的分数增加指定的值

    ZINCRBY key 1 "member1"
  • ZREMRANGEBYRANK:移除有序集合指定排名区间内的所有成员
    ZREMRANGEBYRANK key 0 10
Redis缓存策略与设计
缓存的基本概念

缓存是一种数据存储技术,主要用于加快数据访问速度。Redis作为一种内存数据库,非常适合用作缓存。缓存的基本概念包括以下几个方面:

  • 缓存命中:当请求的数据在缓存中存在时,称为缓存命中。
  • 缓存失效:当请求的数据不在缓存中存在时,称为缓存失效。
  • 缓存策略:缓存策略决定了数据如何被存储和删除。常见的缓存策略包括LRU(Least Recently Used,最近最少使用)、LFU(Least Frequently Used,最不经常使用)、FIFO(First In First Out,先进先出)等。
如何设计缓存策略

设计缓存策略时需要考虑以下几个方面:

  • 缓存大小:需要根据业务需求、硬件资源等来确定缓存的大小,以保证在性能和资源之间取得平衡。
  • 缓存数据结构:选择合适的数据结构存储缓存数据,例如字符串、哈希、列表、集合等。
  • 缓存命中率:通过合理设置缓存策略,提高缓存命中率,减少数据库访问次数。
  • 缓存更新策略:确定如何更新缓存数据,例如缓存数据是否需要与数据库保持一致、缓存数据的有效期等。
常见的缓存问题与解决方法
  • 缓存穿透:缓存穿透是指查询一个不存在的数据,由于数据不存在,缓存中没有数据,每次请求都会穿透到数据库。解决方法:使用布隆过滤器或空值缓存。
  • 缓存击穿:缓存击穿是指热点数据过期后,大量请求涌入数据库,导致数据库压力过大。解决方法:使用加锁或互斥的方法,保证同一时间内只有一个请求去查询数据。
  • 缓存雪崩:缓存雪崩是指在缓存中大量数据同时过期,导致大量请求涌入数据库。解决方法:使用缓存更新策略,避免缓存数据同时失效。

LRU缓存策略示例

from collections import OrderedDict

class LRUCache:
    def __init__(self, capacity=10):
        self.cache = OrderedDict()
        self.capacity = capacity

    def get(self, key):
        if key not in self.cache:
            return None
        # 将获取到的元素移动到队尾,表示最近使用
        self.cache.move_to_end(key)
        return self.cache[key]

    def put(self, key, value):
        if key in self.cache:
            # 先删除旧值,再设置新值,保证有序
            self.cache.pop(key)
        elif len(self.cache) >= self.capacity:
            # 删除最近最少使用的元素
            self.cache.popitem(last=False)
        self.cache[key] = value

# 使用LRU缓存
cache = LRUCache(3)
cache.put("one", 1)
cache.put("two", 2)
cache.put("three", 3)
print(cache.get("one"))
cache.put("four", 4)  # 由于缓存满了,会淘汰最旧的"two",此时"one"、"three"、"four"在缓存中
print(cache.get("two"))

LFU缓存策略示例

from collections import defaultdict

class LFUCache:
    def __init__(self, capacity=10):
        self.capacity = capacity
        self.counts = defaultdict(int)
        self.cache = defaultdict(int)
        self.min_count = 0

    def get(self, key):
        if key not in self.cache:
            return None
        self.counts[key] += 1
        return self.cache[key]

    def put(self, key, value):
        if self.capacity == 0:
            return
        if key in self.cache:
            self.counts[key] += 1
            self.cache[key] = value
        else:
            if len(self.cache) >= self.capacity:
                # 删除最少使用频率的元素
                min_count = min(self.counts.values())
                for k, v in list(self.cache.items()):
                    if self.counts[k] == min_count:
                        del self.cache[k]
                        del self.counts[k]
                        self.min_count = min(self.counts.values())
                        break
            self.cache[key] = value
            self.counts[key] = 1
            self.min_count = 1

# 使用LFU缓存
cache = LFUCache(3)
cache.put("one", 1)
cache.put("two", 2)
cache.put("three", 3)
print(cache.get("one"))
cache.put("four", 4)  # 由于缓存满了,会淘汰最旧的"two",此时"one"、"three"、"four"在缓存中
print(cache.get("two"))
Redis常用工具与客户端
Redis常用命令行工具
  • redis-cli:Redis命令行工具,可以通过redis-cli命令访问Redis服务。

    redis-cli
  • CLI参数redis-cli提供了许多参数,例如-h指定主机地址,-p指定端口。
    redis-cli -h 127.0.0.1 -p 6379
Redis可视化管理工具介绍
  • Redis Desktop Manager:一个跨平台的Redis客户端,支持Windows、Mac OS和Linux。
  • RedisInsight:Redis官方提供的Redis监控和管理工具,支持可视化查看Redis实例的运行状态。
  • Redis Commander:基于Web的Redis管理工具,可以方便地管理和监控Redis实例。
常见的Redis客户端
  • Python客户端redis-py是Python语言的Redis客户端,提供了丰富的API。

    from redis import Redis
    
    r = Redis(host='localhost', port=6379, db=0)
    r.set('foo', 'bar')
    print(r.get('foo'))
  • Java客户端Jedis是Java语言的Redis客户端,提供了Java API访问Redis。

    import redis.clients.jedis.Jedis;
    
    Jedis jedis = new Jedis("localhost");
    jedis.set("foo", "bar");
    System.out.println(jedis.get("foo"));
  • Node.js客户端ioredis是Node.js语言的Redis客户端,支持Redis所有命令。

    const Redis = require('ioredis');
    const redis = new Redis();
    
    redis.set('foo', 'bar');
    redis.get('foo', (err, reply) => {
      console.log(reply);
    });
实践示例

Redis缓存示例

假设我们有一个电商网站,用户可以搜索商品。我们可以使用Redis作为缓存服务器,缓存搜索结果,减少对数据库的访问。

步骤

  1. 当用户搜索商品时,先检查缓存中是否有搜索结果。
  2. 如果缓存中有结果,直接返回缓存中的结果。
  3. 如果缓存中没有结果,从数据库中查询,并将结果存入缓存中。

代码示例

from redis import Redis

# 创建Redis连接
redis_client = Redis(host='localhost', port=6379, db=0)

def search_products(keyword):
    # 检查缓存中是否有搜索结果
    cache_key = f"search:{keyword}"
    cached_results = redis_client.get(cache_key)
    if cached_results:
        # 如果缓存中有结果,直接返回缓存中的结果
        return cached_results

    # 如果缓存中没有结果,从数据库中查询
    db_results = query_database(keyword)
    if db_results:
        # 将查询结果存入缓存中
        redis_client.set(cache_key, db_results)
        return db_results

    return None

def query_database(keyword):
    # 模拟从数据库中查询商品
    # 实际应用中,这应该是一个数据库查询操作
    # 返回查询到的商品列表
    return ["Product1", "Product2", "Product3"]

print(search_products("apple"))
print(search_products("apple"))  # 这次直接从缓存中返回结果

Redis事务示例

假设我们有一个电商网站,用户可以给商品点赞。我们可以使用Redis事务来保证点赞操作的原子性。

步骤

  1. 开始一个Redis事务。
  2. 使用MULTI命令指定这是一个事务操作。
  3. 执行一系列Redis命令,并使用EXEC命令执行事务。
  4. 事务结束后,检查操作是否成功。

代码示例

from redis import Redis

# 创建Redis连接
redis_client = Redis(host='localhost', port=6379, db=0)

def increment_like_count(product_id):
    # 开始一个Redis事务
    redis_client.multi()
    # 使用INCR命令增加点赞数
    redis_client.incr(f"like_count:{product_id}")
    # 执行事务
    result = redis_client.exec()
    if result:
        print("点赞成功")
    else:
        print("点赞失败")

increment_like_count("product1")

Redis发布/订阅示例

假设我们有一个电商网站,用户可以订阅商品,当商品库存发生变化时,发送通知给订阅用户。

步骤

  1. 使用PUBLISH命令发送消息。
  2. 订阅消息,使用SUBSCRIBE命令。
  3. 处理接收到的消息。

代码示例

from redis import Redis
import time

# 创建Redis连接
redis_client = Redis(host='localhost', port=6379, db=0)

def publish_inventory_update(product_id, inventory):
    # 发布消息
    redis_client.publish(f"inventory:{product_id}", inventory)

def subscribe_inventory_updates(product_id):
    # 订阅消息
    pubsub = redis_client.pubsub()
    pubsub.subscribe(f"inventory:{product_id}")
    for message in pubsub.listen():
        if message['type'] == 'message':
            print(f"接收到消息: {message['data']}")
            break

# 执行发布操作
publish_inventory_update("product1", "50")
time.sleep(2)  # 等待一段时间以确保消息发送成功

# 执行订阅操作
subscribe_thread = subscribe_inventory_updates("product1")
time.sleep(2)  # 等待一段时间以确保订阅成功

# 再次执行发布操作
publish_inventory_update("product1", "10")
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
手记
粉丝
31
获赞与收藏
67

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消