redis安装

Ubuntu安装

如果有root权限,或者可以使用sudo安装,那就很简单:
更新系统

sudo apt update

apt安装

sudo apt install redis-server

安装完成后,测试Redis的版本和安装情况:

redis-cli --version

或者

wget http://download.redis.io/releases/redis-7.0.9.tar.gz

tar -zxvf redis-7.0.9.tar.gz

sudo mv ./redis-7.0.9  /usr/local/

cd /usr/local/redis-7.0.9
sudo make

sudo make test

sudo make install
#执行完成后,将redis的可执行程序安装在/usr/local/bin中

进入/usr/local/bin 查看是否安装了

cd /usr/local/bin

ls -all

redis-server       #redis的服务器
redis-cli       #redis命令行客户端
redis-benchmark  #redis性能测试工具
redis-check-aof  #AOF文件修复工具
redis-check-rdb        #RDB文件检索工具

如果没有root权限,不能使用sudo安装,需要安装到本地

wget http://download.redis.io/releases/redis-7.0.9.tar.gz
tar -zxvf redis-7.0.9.tar.gz
cd redis-7.0.9
sudo make
sudo make test

在这里插入图片描述
新建redis文件夹,安装redis,如下:

make install PREFIX=../redis

Win11安装

清空当前缓存和所有缓存

Windows环境下使用命令行进行redis缓存清理

  • redis安装目录下输入cmd
  • redis-cli -p 端口号
  • flushdb 清除当前数据库缓存
  • flushall 清除整个redis所有缓存

在redis安装目录下,右键选择“在终端打开”,如下图:
在这里插入图片描述

(base) PS C:\Program Files\Redis> redis-cli -p 6379
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379>

在这里插入图片描述

配置内存大小,防止内存饱满

1、通过在Redis安装目录下的redis.conf配置文件设置内存大小

maxmemory 4096mb

2、通过cmd

//设置Redis最大占用内存大小为100M
127.0.0.1:6379> config set maxmemory 4096mb
//获取设置的Redis能使用的最大内存大小
127.0.0.1:6379> config get maxmemory

在这里插入图片描述

设置内存淘汰策略

  • noeviction策略:内存空间达到maxmemory时,不会淘汰数据,有新写入时会返回错误。
  • volatile-ttl策略:针对设置了过期时间的键值对,根据过期时间的先后进行修改,越早过期的越先被删除。
  • volatile-random策略:在设置了过期时间的键值对中,进行随机删除。
  • volatile-lru策略:使用LRU算法筛选设置了过期时间的键值对,进行删除。
  • volatile-lfu策略:使用LFU算法筛选设置了过期时间的键值对,进行删除。
  • allkeys-random策略:在所有键值对中随机选择并删除数据。
  • allkeys-lru策略:使用LRU算法在所有数据中进行筛选并删除数据。
  • allkeys-lfu策略:使用LFU算法在所有数据中进行筛选并删除数据。

当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误
设置方法

127.0.0.1:6379> config set maxmemory-policy allkeys-lru

查看策略

127.0.0.1:6379> config get maxmemory-policy

键过期机制

一个键过期机制——给key设置一个过期时间,一旦超过过期时间,这个key就会被被删除,内存将被回收。

设置键值时,EXPIRE单位是秒,PEXPIRE单位是毫秒
在Redis中,可以使用以下命令来设置键的过期时间:

  1. EXPIRE key ttl:设置键在ttl秒后过期。

例如,要设置一个名为“username”的键在60秒后过期,可以执行以下命令:

EXPIRE username 60

如果设置成功,将返回1;如果键不存在或者设置失败,将返回0。

  1. PEXPIRE key milliseconds:设置键在毫秒后过期。

例如,要设置一个名为“email”的键在1000毫秒后过期,可以执行以下命令:

PEXPIRE email 1000

如果设置成功,将返回1;如果键不存在或者设置失败,将返回0。

  1. EXPIREAT key timestamp:设置键在某个时间戳(精确到秒)之后过期。

例如,要设置一个名为“password”的键在2023年1月1日0点1分过期,可以执行以下命令:

EXPIREAT password 1672752660

如果设置成功,将返回1;如果键不存在或者设置失败,将返回0。

  1. PEXPIREAT key millisecondsTimestamp:设置键在某个时间戳(精确到毫秒)之后过期。

例如,要设置一个名为“access_token”的键在2023年1月1日0点1分10秒后过期,可以执行以下命令:

PEXPIREAT access_token 1672752670000

如果设置成功,将返回1;如果键不存在或者设置失败,将返回0。

需要注意的是,当键已经存在时,才允许设置过期时间。如果键不存在,使用上述命令将返回0。此外,当键过期后,可以使用TTL和PTTL命令来查看该键的剩余存活时间。如果键不存在或者未设置过期时间,将返回-1或-2。
TTL单位是秒,PTTL单位是毫秒

127.0.0.1:6379> TTL KEY
127.0.0.1:6379> PTTL KEY

发布与订阅

当你使用Redis的发布/订阅功能时,你可以订阅一个或多个频道以接收消息,也可以向一个频道发布消息。以下是你给出的命令的详细解释:

  1. 订阅频道 - subscribe chat1

    • 使用subscribe命令订阅一个频道chat1。一旦订阅,当有消息发布到chat1时,该命令会接收这些消息。
  2. 发布消息 - publish chat1 “hell0 ni hao”

    • 使用publish命令向频道chat1发布消息“hell0 ni hao”。所有订阅了chat1频道的客户端都会收到这条消息。
  3. 查看频道 - pubsub channels

    • 使用pubsub命令并传递channels选项来列出所有可用的频道。
  4. 查看某个频道的订阅者数量 - pubsub numsub chat1

    • 使用pubsub命令并传递numsub选项后跟频道名称(例如chat1)来查看特定频道的订阅者数量。
  5. 退订指定频道 - unsubscribe chat1, punsubscribe java.*

    • 使用unsubscribe命令退订一个频道,例如chat1。
    • 使用punsubscribe命令退订所有匹配给定模式的频道,例如所有以“java.”开头的频道。
  6. 订阅一组频道 - psubscribe java.*

    • 使用psubscribe命令订阅一个模式匹配的所有频道。例如,通过订阅所有以“java.”开头的频道,你可以接收所有这些频道的消息。

代码实现:

当然,你可以使用`redis-py`库在Python中实现Redis的发布/订阅功能。首先,你需要安装这个库(如果还没有的话):


```bash
pip install redis

以下是如何使用Python和redis-py来实现你给出的命令:

import redis

# 连接到Redis服务器
r = redis.StrictRedis(host='localhost', port=6379, db=0)

# 订阅频道
def subscribe_channel(channel):
    pubsub = r.pubsub()
    pubsub.subscribe(channel)
    return pubsub

# 发布消息
def publish_message(channel, message):
    r.publish(channel, message)

# 查看频道
def list_channels():
    return r.pubsub_channels()

# 查看某个频道的订阅者数量
def num_subscribers(channel):
    return r.pubsub_numsub(channel)

# 退订指定频道
def unsubscribe_channel(channel):
    pubsub = r.pubsub()
    pubsub.unsubscribe(channel)
    return pubsub

# 订阅一组频道
def psubscribe_channels(pattern):
    pubsub = r.pubsub()
    pubsub.psubscribe(pattern)
    return pubsub

使用方法:

  1. 订阅频道: subscribe_channel('chat1')。这将返回一个redis.PubSub对象,你可以从该对象接收消息。
  2. 发布消息: publish_message('chat1', 'hell0 ni hao')。这将向’chat1’频道发布消息。
  3. 查看频道: list_channels()。这将返回一个列表,其中包含所有可用的频道名称。
  4. 查看某个频道的订阅者数量: num_subscribers('chat1')。这将返回一个列表,其中包含频道的订阅者数量。
  5. 退订指定频道: unsubscribe_channel('chat1')。这将返回一个redis.PubSub对象,表示已经退订了该频道。
  6. 订阅一组频道: psubscribe_channels('java.*')。这将返回一个redis.PubSub对象,表示已经订阅了匹配给定模式的所有频道。

list 相关操作

  1. lpush mylist a b c

    • 将元素a、b、c插入到键为mylist的列表的左侧。执行此命令后,列表的内容将是a, b, c。
  2. rpush mylist x y z

    • 将元素x、y、z插入到键为mylist的列表的右侧。执行此命令后,列表的内容将是a, b, c, x, y, z。
  3. lrange mylist 0 -1

    • 获取键为mylist的列表中的所有元素。执行此命令后,将返回一个列表,内容为a, b, c, x, y, z。
  4. lpop mylist

    • 从键为mylist的列表的左侧弹出一个元素。执行此命令后,列表的内容将是b, c, x, y, z,并且弹出的元素a被返回。
  5. rpop mylist

    • 从键为mylist的列表的右侧弹出一个元素。执行此命令后,列表的内容将是a, b, c, x, y,并且弹出的元素z被返回。
  6. llen mylist

    • 获取键为mylist的列表的长度。执行此命令后,将返回列表的长度,即6。
  7. lrem mylist count value

    • 从键为mylist的列表中删除指定数量的与给定值相等的元素。例如,lrem mylist 3 a将删除3个a元素。如果列表中有3个a元素,执行此命令后,列表的内容将是b, c, x, y, z。
  8. lindex mylist 2

    • 获取键为mylist的列表中指定索引处的元素。在Redis中,索引是从0开始的。因此,索引2指的是第三个元素,即c。执行此命令后,将返回c。
  9. lset mylist 2 n

    • 将键为mylist的列表中指定索引处的元素的值设置为n。执行此命令后,列表的内容将是a, b, n, x, y, z。注意:如果索引超出了列表的范围,这个命令不会有任何效果。
  10. ltrim mylist 0 4

    • 删除键为mylist的列表中所有不在指定范围内的元素。执行此命令后,列表的内容将是a, b, c, x, y。所有不在这个范围内的元素都被删除了。
  11. linsert mylist before a

    • 在键为mylist的列表中指定元素a的前面插入一个新元素。例如,如果列表的内容是a, b, c,执行此命令后,内容将是x, a, b, c。注意:如果元素a不存在于列表中,这个命令不会有任何效果。
  12. linsert mylist after a

    • 在键为mylist的列表中指定元素a的后面插入一个新元素。例如,如果列表的内容是a, b, c,执行此命令后,内容将是a, x, b, c。注意:如果元素a不存在于列表中,这个命令不会有任何效果。
  13. rpoplpush list list2

    • 从键为list的列表中弹出一个元素,并将其推入键为list2的另一个已存在的列表的右侧。同时将该元素的成功转移也作为结果返回给客户端。如果list2不存在,Redis将创建一个空列表来执行这个操作。执行此命令后,列表list2的内容将是弹出的元素,而列表list的内容不会改变。

代码如下:

import redis

# 连接到Redis服务器  
r = redis.Redis(host='localhost', port=6379, db=0)

# 执行Redis命令的示例  

# 1. lpush mylist a b c  
r.lpush('mylist', 'a', 'b', 'c')

# 2. rpush mylist x y z  
r.rpush('mylist', 'x', 'y', 'z')

# 3. lrange mylist 0 -1  
result = r.lrange('mylist', 0, -1)
print(result)  # 输出: ['a', 'b', 'c', 'x', 'y', 'z']  

# 4. lpop mylist  
result = r.lpop('mylist')
print(result)  # 输出: 'a'  

# 5. rpop mylist  
result = r.rpop('mylist')
print(result)  # 输出: 'z'  

# 6. llen mylist  
result = r.llen('mylist')
print(result)  # 输出: 5  

# 7. lrem mylist count value  
result = r.lrem('mylist', 3, 'a')
print(result)  # 输出: 3,表示删除了3个a元素  

# 8. lindex mylist 2  
result = r.lindex('mylist', 2)
print(result)  # 输出: 'c'  

# 9. lset mylist 2 n  
r.lset('mylist', 2, 'n')

# 10. ltrim mylist 0 4  
r.ltrim('mylist', 0, 4)
result = r.lrange('mylist', 0, -1)  # 重置列表以进行下一步操作  
print(result)  # 输出: ['a', 'b', 'n', 'x', 'y']  

# 11. linsert mylist before a x  
r.linsert('mylist', 'before', 'a', 'x')
result = r.lrange('mylist', 0, -1)  # 重置列表以进行下一步操作  
print(result)  # 输出: ['x', 'a', 'b', 'n', 'x', 'y']  

# 12. linsert mylist after a x  
r.linsert('mylist', 'after', 'a', 'x')
result = r.lrange('mylist', 0, -1)  # 重置列表以进行下一步操作  
print(result)  # 输出: ['x', 'a', 'x', 'b', 'n', 'x', 'y']  


import redis

# 连接到Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)

# 创建并填充键为'list'和'list2'的列表
r.lpush('list', 'a', 'b', 'c')
r.lpush('list2', 'x', 'y', 'z')

# 使用rpoplpush命令将元素从'list'转移到'list2'
result = r.rpoplpush('list', 'list2')
print(result)  # 输出: 'c',因为'c'是从'list'中弹出的元素  

# 获取并打印'list'和'list2'的内容以验证结果
list_content = r.lrange('list', 0, -1)  # ['b', 'a']
list2_content = r.lrange('list2', 0, -1)  # ['c', 'x', 'y', 'z']
print("List content:", list_content)
print("List2 content:", list2_content)

更多推荐