redis学习笔记

jupiter
2023-08-15 / 0 评论 / 41 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年09月05日,已超过395天没有更新,若内容或图片失效,请留言反馈。

1.Redis介绍

1.1 Redis 简介

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

1.2 Redis 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

1.3 Redis与其他key-value存储有什么不同?

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

2.Redis安装和配置

3.Redis常用命令

3.1 Redis 客户端连接服务器

# 连接远程服务器语法
$ redis-cli -h host -p port -a password 

# 连接本机无密码redis服务器示例 并使用ping命令检测服务器是否启动
alpine1:/home/gitlab/etc# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping
PONG

3.2 Redis 键(key)

Redis 键命令用于管理 redis 的键

# Redis 键命令基本语法
redis 127.0.0.1:6379> COMMAND KEY_NAME

# 删除key,如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0
127.0.0.1:6379> del key
(integer) 1

# 检查给定 key 是否存在。
127.0.0.1:6379> exists key
(integer) 1
127.0.0.1:6379> exists noexistkey
(integer) 0

# 为给定 key 设置过期时间,以秒计。
127.0.0.1:6379> expire key 100
(integer) 1

# 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
127.0.0.1:6379> ttl key
(integer) 44

# 设置 key 的过期时间以毫秒计。
127.0.0.1:6379> pexpire key 1000000
(integer) 1

# 以毫秒为单位返回 key 的剩余的过期时间。
127.0.0.1:6379> pttl key
(integer) 994201

# 移除 key 的过期时间,key 将持久保持。
127.0.0.1:6379> persist key
(integer) 1
127.0.0.1:6379> ttl key
(integer) -1

# 查找所有符合给定模式( pattern)的 key 。
127.0.0.1:6379> keys *
1) "key"
2) "key1"

# 修改 key 的名称
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> rename key1 key2
OK
127.0.0.1:6379> get key2
"hello"

# 仅当 newkey 不存在时,将 key 改名为 newkey 。
127.0.0.1:6379> renamenx key2 key
(integer) 0
127.0.0.1:6379> renamenx key2 key3
(integer) 1

# 查看key 所储存的值的类型。
127.0.0.1:6379> type key
string

3.3 Redis 字符串命令

# 设置指定 key 的值。
127.0.0.1:6379> set key helloworld
OK

# 获取指定 key 的值。
127.0.0.1:6379> get key
"helloworld"

# 将 key 中储存的数字值增一。
127.0.0.1:6379> set number 100
OK
127.0.0.1:6379> incr number
(integer) 101

# 将 key 所储存的值加上给定的增量值(increment) 。
127.0.0.1:6379> incrby number 101
(integer) 202

# 将 key 中储存的数字值减一。
127.0.0.1:6379> decr number
(integer) 201

# key 所储存的值减去给定的减量值(decrement) 。
127.0.0.1:6379> decrby number 100
(integer) 101

# 指定的 value 追加到该 key 原来值(value)的末尾。
127.0.0.1:6379> set appendstr hello
OK
127.0.0.1:6379> append appendstr world
(integer) 10
127.0.0.1:6379> get appendstr
"helloworld"

# 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
127.0.0.1:6379> setex key seconds value

3.4 Redis 哈希(Hash)命令

  • Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
  • 类似java中的HashMap
  • Redis 中每个 hash 可以存储 $2^32$ - 1 键值对(40多亿)。
# 批量设置hash对象的属性
# 语法 hmset key field value [field value ...]
127.0.0.1:6379> hmset person name zhangsan age 22 school caus
OK

# 获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "school"
6) "caus"

# 将哈希表 key 中的字段 field 的值设为 value 。
# 语法 hset key field value
127.0.0.1:6379> hset person girlfirend xiaohong
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "school"
6) "caus"
7) "girlfirend"
8) "xiaohong"

# 删除一个或多个哈希表字段
# 语法 hdel key field [field ...]
127.0.0.1:6379> hdel person girlfirend
(integer) 1
127.0.0.1:6379> hgetall person
1) "name"
2) "zhangsan"
3) "age"
4) "22"
5) "school"
6) "caus"

# 获取存储在哈希表中指定字段的值。
# 语法 hget key field
127.0.0.1:6379> hmget person name
1) "zhangsan"

3.5 Redis 列表(List)命令

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

# 将一个或多个值插入到列表头部
# 语法 lpush key value [value ...]
127.0.0.1:6379> lpush list a b c d
(integer) 4

# 查看列表指定区间元素、查看列表全部元素
# 语法 lrange key start stop
127.0.0.1:6379> lrange list 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list 0 2
1) "d"
2) "c"

# 通过索引获取列表中的元素
# 语法 lindex key index
127.0.0.1:6379> lindex list 2
"b"

# 获取列表长度
127.0.0.1:6379> llen list
(integer) 4

# 移出并获取列表的第一个元素
127.0.0.1:6379> lpop list
"d"

# 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
# 语法 ltrim key start stop
127.0.0.1:6379> ltrim list 0 1
OK
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"

# 在列表中添加一个或多个值到列表尾部
# 语法 rpush key value [value ...]
127.0.0.1:6379> rpush list e f i g h i j k
(integer) 10
127.0.0.1:6379> lrange list 0 -1
 1) "c"
 2) "b"
 3) "e"
 4) "f"
 5) "i"
 6) "g"
 7) "h"
 8) "i"
 9) "j"
10) "k"

# 移除列表的最后一个元素,返回值为移除的元素。
127.0.0.1:6379> rpop list
"k"

3.6 Redis 集合(Set)命令

  • Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
  • 集合对象的编码可以是 intset 或者 hashtable。
  • Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
# 向集合添加一个或多个成员
# 语法 sadd key member [member ...]
127.0.0.1:6379> sadd myset hello world
(integer) 2

# 查看集合所有元素
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"

3.7 Redis 有序集合(sorted set)命令

  • Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
  • 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
  • 有序集合的成员是唯一的,但分数(score)却可以重复。
# 向有序集合添加一个或多个成员,或者更新已存在成员的分数
# 语法 zadd key score1 member1 [score2 member2]
127.0.0.1:6379> zadd sortedset 80 xiaoming 90 xiaohong 66 zhangsan
(integer) 3

# 通过索引区间返回有序集合指定区间内的成员
# 语法 zrange key start stop [WITHSCORES]
127.0.0.1:6379> zrange sortedset 0 100 WITHSCORES
1) "zhangsan"
2) "66"
3) "xiaoming"
4) "80"
5) "xiaohong"
6) "90"
127.0.0.1:6379> zrange sortedset 0 100
1) "zhangsan"
2) "xiaoming"
3) "xiaohong"

# 计算在有序集合中指定区间分数的成员数
# 语法 zcount key min max
127.0.0.1:6379> zcount sortedset 80 90
(integer) 2

# 有序集合中对指定成员的分数加上增量 increment
# 语法 zincrby key increment member
127.0.0.1:6379> zincrby sortedset 10 zhangsan
"76"

# 移除有序集合中的一个或多个成员
# 语法 zrem key member [member ...]
127.0.0.1:6379> zrem sortedset xiaoming
(integer) 1
127.0.0.1:6379> zrange sortedset 0 100 WITHSCORES
1) "zhangsan"
2) "76"
3) "xiaohong"
4) "90"

4.Redis 发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client3 和 client1 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

# 订阅给定的一个或多个频道的信息。
# 语法 subscribe channel [channel ...]

# 将信息发送到指定的频道。
# publish channel message
  • 示例
# 第一个客户端--订阅者
127.0.0.1:6379> subscribe jupizhe
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "jupiter"
3) (integer) 1
1) "message"
2) "jupiter"
3) "hello, welcom to subscribe"
1) "message"
2) "jupiter"
3) "who are you"

# 第二个客户端--发布者
127.0.0.1:6379> publish jupiter "who are you"
(integer) 1

5.Redis Stream

6.Java maven项目使用 Redis

6.1 pom.xml

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency

6.2 连接到 redis 服务

@Test
void testRedisConnect(){
    //连接 Redis 服务
    Jedis jedis = new Jedis("172.31.126.219");
    // 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
    // jedis.auth("123456");
    System.out.println("连接成功");
    //查看服务是否运行
    System.out.println("服务正在运行: "+jedis.ping());
}
连接成功
服务正在运行: PONG

6.3 Redis Java String(字符串) 实例

@Test
void testRedisString() throws InterruptedException {
    //连接 Redis 服务
    Jedis jedis = new Jedis("172.31.126.219");
    // 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
    // jedis.auth("123456");
    System.out.println("连接成功");
    //设置 redis 字符串数据
    jedis.setex("verifycode",300,"387432");
    // 获取存储的数据并输出
    System.out.println("redis 存储的字符串为: "+ jedis.get("verifycode"));
    Thread.sleep(3000);
    System.out.println("redis 存储的字符串有效期为: "+ jedis.ttl("verifycode")+" 秒");
}
连接成功
redis 存储的字符串为: 387432
redis 存储的字符串有效期为: 297 秒

6.4 Redis Java List(列表) 实例

@Test
void testRedisList() {
    //连接Redis 服务
    Jedis jedis = new Jedis("172.31.126.219");
    // 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
    // jedis.auth("123456");
    System.out.println("连接成功");
    //存储数据到列表中
    jedis.lpush("site-list", "JinDong");
    jedis.lpush("site-list", "Google");
    jedis.lpush("site-list", "Taobao");
    // 获取存储的数据并输出
    List<String> list = jedis.lrange("site-list", 0 ,2);
    for(int i=0; i<list.size(); i++) {
        System.out.println("列表项为: "+list.get(i));
    }
连接成功
列表项为: Taobao
列表项为: Google
列表项为: JinDong
  • 其他调用参考redis常用命令

参考资料

  1. Redis 教程 | 菜鸟教程 (runoob.com)
  2. Redis命令大全(超详细) - 蚂蚁小哥 - 博客园 (cnblogs.com)
  3. Redis(第1期):如何在Java中优雅的使用Redis - 知乎 (zhihu.com)
  4. Redis命令大全(超详细) - 蚂蚁小哥 - 博客园 (cnblogs.com)
0

评论 (0)

打卡
取消