Redis 学习笔记
原创 已于 2024-11-16 16:04:50 修改 · 粉丝可见 · 1.2k 阅读 · 28 · 20 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/143696339
目录
[TOC]
引言
Redis(Remote Dictionary Server)是一个开源的高性能键值存储数据库,以其卓越的性能和低延迟特性而闻名。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等,使其成为开发人员在构建各种应用程序时的首选。
官网: https://redis.io
中文网: https://www.redis.net.cn/
什么是 Redis
Redis 是一个基于内存的数据库,它提供了原子操作、丰富的数据类型、持久化选项以及一个简单的发布/订阅系统。由于其数据存储在内存中,Redis 能够提供极高的读写速度,使其成为处理大量数据时的理想选择。
Redis 的主要特点
性能 :Redis 的读写速度非常快,因为它的数据存储在内存中。
持久化 :尽管 Redis 是基于内存的,但它提供了多种持久化选项,确保数据的安全性。
数据结构 :Redis 支持多种数据结构,如字符串、列表、集合、有序集合、散列等。
原子性 :Redis 的所有操作都是原子性的,这意味着它们要么完全执行,要么完全不执行。
复制 :Redis 支持主从复制,可以用于数据冗余和负载均衡。
高可用性 :通过哨兵系统,Redis 可以实现高可用性配置,自动处理主服务器故障转移。
Lua 脚本 :Redis 支持 Lua 脚本,允许在服务器端执行复杂的操作。
发布/订阅 :Redis 提供了一个发布/订阅系统,允许客户端订阅消息频道并接收消息。
Redis 的应用场景
缓存 :由于其高速性能,Redis 常被用作数据库查询结果的缓存。
会话存储 :在 Web 应用中,Redis 可以用来存储用户会话。
排行榜 :Redis 的有序集合非常适合实现排行榜功能。
消息队列 :Redis 可以用作消息队列系统,处理异步任务。
实时分析 :Redis 可以用于实时分析,如计数器、实时分析等。
Redis 下载与安装
Redis安装包分为 Windows 版和 Linux 版:
Windows版下载地址 : https://github.com/microsoftarchive/redis/releases
Linux版下载地址 : https://download.redis.io/releases/

Redis的 Windows 版属于绿色软件、直接解压即可使用,解压后目录结构如下:

Redis 入门
启动 redis 服务
1
| redis-server.exe redis.windows.conf
|

连接 redis 服务

连接其它 redis 服务
1
| redis-cli.exe -h localhost -p 6379 -a 123456
|
-h : host ,表示连接的服务地址
-p:port,表示连接的服务端口
-a:password,表示连接服务的登录密码
Redis客户端界面
由于命令行窗口的客户端不太方便,所以这里常用的客户端软件如下,自行从网络下载。

Redis 常用的 5 中数据类型
Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型,value 有 5 种常用的数据类型:
字符串 string
哈希 hash
列表 list
集合 set
有序集合 sorted set / zset
各种数据类型的特点

字符串(String):普通字符串,Redis 中最简单的数据类型
哈希(hash):也叫散列,类似于 Java 中的 HashMap 结构
列表(list):按照插入顺序排序,可以有重复元素,类似于 Java中的 LinkedList
集合(set):无序集合,没有重复元素,类似于 Java 中的 HashSet
有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素。
字符串(String)常用操作命令
SET key value:设置指定 key 的值
GET key:获取指定 key 的值
SETEX key seconds value:设置指定 key 的值,并将 key 的过期时间设为 seconds 秒
SETNX key value:只有在 key 不存在时 设置 key 的值
哈希操作命令
HSET key field value : 将哈希表 key 中的字段 field 的值设为 value
HGET key field : 获取存储在哈希表中指定字段的值
HDEL key field : 删除存储在哈希表中的指定字段
HKEYS key :获取哈希表中所有字段
HVALUES key:获取哈希表中所有值

列表操作命令

集合操作命令
SADD key member1 [member2] :想集合添加一个或多个成员
SMEMBERS key :返回集合中的所有成员
SCARD key :获取集合的成员数
SINTER key1 [key2] :返回给定所有集合的交集
SUNION key1 [key2] :返回所有给定集合的并集
SREM key member1 [member2] :删除集合中一个或多个成员

有序集合操作命令
ZADD key score1 member1 [score2 member2] :向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES] :通过索引区间返回有序集合中指定区间内的成员
ZINCRBY key increment member :有序集合中对指定成员的分数加上增量 increment
ZREM key member [member ...] :移除有序集合中的一个或多个成员

Redis 通用命令
Redis的通用命令是不分数据类型的,都可以使用的命令:
KEYS pattern :查找所有符合给定模式( pattern) 的 key
EXISTS key :检查给定 key 是否存在
TYPE key :返回 key 所存储的值的类型
DEL key : 该命令用于在 key 存在时删除 key
在Java中操作 Redis
Rdis 的 Java 客户端
Redis 的 Java 客户端很多,常用的几种:
Jedis
Lettuce
Spring Data Redis
SpringData Redis 是Spring 的一部分,对 Redis 底层开发包进行了高度封装,在 spring项目中,可以使用spring Data Redis来简化操作。
Spring Data Redis 使用方式
1、导入Maven 的pom坐标
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
|
2、配置文件 yaml
1 2 3 4 5
| redis: host: localhost port: 6379 password: 123456 database: 0
|
3、编写config配置类,创建 RedisTemplate对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer;
@Slf4j @Configuration public class RedisConfiguration {
@Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ log.info("开始创建 redis 模板对象"); RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate; } }
|
4、通过 注入 RedisTemplate 对象操作 Redis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.*;
import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit;
@SpringBootTest public class SpingDataRedisTest {
@Autowired private RedisTemplate redisTemplate;
@Test public void testRedisTemplate(){ System.out.println(redisTemplate);
ValueOperations valueOperations = redisTemplate.opsForValue();
HashOperations hashOperations = redisTemplate.opsForHash();
ListOperations listOperations = redisTemplate.opsForList();
SetOperations setOperations = redisTemplate.opsForSet();
ZSetOperations zSetOperations = redisTemplate.opsForZSet(); } }
|
Java对Redis字符串操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
@Test public void testString(){
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("name", "angindem");
String name = (String) valueOperations.get("name");
System.out.println("name = " + name);
valueOperations.set("code", "1234",3, TimeUnit.MINUTES);
valueOperations.setIfAbsent("lock","1"); valueOperations.setIfAbsent("lock","2"); }
|
Java对 Redis 哈希操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Test public void testHash(){ HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("100", "name","tom" ); hashOperations.put("100", "age","20" );
String name = (String)hashOperations.get("100", "name");
System.out.println("name = " + name);
Set keys = hashOperations.keys("100"); System.out.println(keys);
List values = hashOperations.values("100"); values.forEach(System.out::println);
hashOperations.delete("100","age"); }
|
Java对 Redis 的 列表操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Test public void testList(){ ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("mylist", "a","b","c");
listOperations.leftPush("mylist", "d");
List mylist = listOperations.range("mylist", 0, -1); System.out.println(mylist);
listOperations.rightPop("mylist");
Long size = listOperations.size("mylist"); System.out.println("listSize = " + size); }
|
Java对 Redis 的集合操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| @Test public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set1", "a","b","c","d"); setOperations.add("set2", "a","b","x","y");
Set set1Members = setOperations.members("set1"); System.out.println(set1Members);
Long set1Size = setOperations.size("set1"); System.out.println(set1Size);
Set intersect = setOperations.intersect("set1", "set2"); System.out.println(intersect);
Set union = setOperations.union("set1", "set2"); System.out.println(union);
setOperations.remove("set1", "a","b"); }
|
Java对 Redis 的有序集合操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Test public void testZset(){ ZSetOperations zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("zset1", "a",10); zSetOperations.add("zset1", "b",12); zSetOperations.add("zset1", "c",9);
Set zset1 = zSetOperations.range("zset1", 0, -1); System.out.println(zset1);
zSetOperations.incrementScore("zset1", "c", 10);
zSetOperations.remove("zset1", "a","b"); }
|
Java 对 Redis 的通用命令操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @Test public void testCommon(){
Set keys = redisTemplate.keys("*"); System.out.println(keys);
Boolean name = redisTemplate.hasKey("name"); Boolean set1 = redisTemplate.hasKey("set1"); System.out.println("nameIsExists? = " + name); System.out.println("set1IsExists? = " + set1);
for (Object key : keys){ DataType type = redisTemplate.type(key); System.out.println(type.name()); }
redisTemplate.delete("mylist"); }
|