SpringBootWeb 篇-深入了解 Redis 五种类型命令与如何在 Java 中操作 Redis
redis.windows.conf:配置文件,用来配置 Redis 服务器的各种参数和选项。redis-server.exe:Redis 服务端可执行文件,用来启动 Redis 服务端。redis-cli.exe:Redis 客户端可执行文件,用来启动 Redis 客户端。
🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
文章目录
1.0 Redis 概述
Redis 是一个基于内存的 key-value 结构数据库。基于内存存储,读写性能高。适合存储热点数据,以便大量用户访问时可以快速得到响应。
1.1 Redis 下载与安装
Redis 官网:Redis - The Real-time Data Platform
Redis 的 Windows 版属于绿色软件。直接解压即可使用,解压目录结构如下:
1)redis.windows.conf:配置文件,用来配置 Redis 服务器的各种参数和选项。
比如:
port:指定 Redis 服务器监听的端口号,默认为 6379。
bind:指定Redis服务器监听的IP地址。
requirepass:设置访问Redis数据库需要的认证密码。
maxmemory:设置Redis数据库使用的最大内存限制。
maxclients:设置Redis允许的最大客户端连接数。
logfile:指定Redis日志文件的位置。
dir:指定Redis持久化数据文件的存储目录。
pidfile:指定Redis服务器进程的PID文件位置。
2)redis-server.exe:Redis 服务端可执行文件,用来启动 Redis 服务端。
3)redis-cli.exe:Redis 客户端可执行文件,用来启动 Redis 客户端。
2.0 Redis 数据类型
Redis 存储的是 key-value 结构的数据,其中 key 是字符串类型,value 有5 种常用的数据类型:字符串 string、哈希 hash、列表 list、集合 set、有序集合 sorted set/zset 。
各种数据类型的特点:
1)字符串 string:普通字符串,Redis 中最简单的数据类型。
2)哈希 hash:也叫散列,类似于 Java 中的 HashMap 结构。
3)列表 list:按照插入顺序,可以有重复元素,类似于 Java 中的 LinkedList 。
4)集合 set:无序集合,没有重复元素,类似于 Java 中的 HashSet 。
5)有序集合 zset:集合中每一个元素关联一个分数 score,根据分数升序排序,没有重复元素。
3.0 Redis 常见五种类型的命令
字符串操作命令、哈希操作命令、列表操作命令、集合操作命令、有序集合操作命令。
3.1 字符串操作命令
Redis 字符串类型的常用命令:
1)SET key value:设置指定 key 的值。
2)GET key:获取指定 key 的值。
3)SETEX key seconds value:设置指定 key 的值,并将 key 的过期时间设为 seconds 秒。
4)SETNX key value:只有在 key 不存在时设置 key 的值。
代码演示:
> set id 1 OK > get id 1 > setex code 30 123456 OK > setnx id 2 0
3.2 哈希操作命令
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
Redis 哈希类型的常用命令:
1)HSET key field value:将哈希表 key 中的字段 field 的值设为 value 。
2)HGET key field:获取存储在哈希表中指定字段的值。
3)HDEL key field:删除存储在哈希表中的指定字段。
4)HKEYS key:获取哈希表中所有字段。
5)HVALS key:获取哈希表中所有值。
代码演示:
存储一个 student 对象信息。
设置字段值:
> HSET student name 小板 1 > HSET student age 22 1 > hset student gender 男 1
运行结果:
获取相应字段的值:
> hget student name 小板 > hget student age 22 > hget student gender 男
获取字段相对应的值。
获取 student 所有的 field 与 所有的 value:
> hkeys student name age gender > hvals student 小板 22 男
删除指定的字段:
> hdel student gender 1
运行结果:
3.3 列表操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序。
Redis 列表类型的常用命令:
1)LPUSH key value1 [value2]:将一个或多个值插入到列表头部。
2)LRANGE key start stop:获取列表指定范围内的元素。
3)RPOP key:移除并获取列表最后一个元素。
4)LLEN key:获取列表长度。
代码演示:
在列表中插入多个值:
> lpush mylist a b c d 4
运行结果:
该插入的方式为:头插数据。
获取指定全部数据:
> lrange mylist 0 -1 d c b a
删除最后一个元素:
> rpop mylist a
获取列表中的个数:
> llen mylist 3
3.4 集合操作命令
Redis set 是 string 类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据。
Redis 集合类型的常用命令:
1)SADD key member1 [member2]:向集合添加一个或多个成员。
2)SMEMBERS key:返回集合中的所有成员。
3)SCARD key:获取集合的成员数。
4)SINTER key1 [key2]:返回给定所有集合的交集。
5)SUNION key1 [key2]:返回所有给定所有集合的并集。
6)SREM key member1 [member2]:删除集合中一个或多个成员。
代码演示:
向集合中添加元素:
> sadd set1 a b c d 4 > sadd set2 a b x y 4
需要注意的是,添加顺序不等于存储之后的顺序。这里就可以体现出了无序性。
获取所有的成员:
> smembers set1 a d c b > smembers set2 a x y b
获取集合中成员的个数:
> scard set1 4 > scard set2 4
获取两个集合的交集:
> sinter set1 set2 a b
获取两个集合的并集:
> sunion set1 set2 a x y d c b
3.5 有序集合操作命名
Redis 有序集合是 string 类型元素的集合,且不允许有重复成员。每一个元素都会关联一个 double 类型的分数。
Redis 有序集合类型的常用命令:
1)ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员。
2)ZRANGE key start stop[WITHSCORE]:通过索引区间返回有序集合中指定区间的成员。
3)ZINCRBY key increment member:有序集合中对指定成员的分数加上增量 increment 。
4)ZREM key member1 [member2]:移除有序集合中的一个或多个成员。
代码演示:
向有序集合中添加成员:
> zadd zset 10 a 11 b 12 c 3
运行结果:
获取全部成员:
> zrange zset 0 -1 a b c
也可以带上分数:
> zrange zset 0 -1 WITHSCORES a 10 b 11 c 12
对 zet 集合中的指定成员的 score 增加:
> zincrby zset 5 a 15
运行结果:
移除集合中指定的成员:
> zrem zset c 1
运行结果:
3.6 通用命令
Redis 的通用命令是不分数据类型的,都可以使用命令。
Redis 通用的常用命令:
1)KEYS pattern:查找所有符合给定模式(pattern)的 key 。
2)EXISTS key:检查给定 key 是否存在。
3)TYPE key:返回 key 所存储的值的类型。
4)DEL key:该命令用于在 key 存在则删除 key 。
代码演示:
KEYS *,匹配所有的 key:
> keys * id STUDENT set2 zset set1 student mylist list
检查是否存在 set1:
> exists set1 1 > exists set3 0
存在则返回 1;不存在则返回 0 。
判断类型:
> type set1 set > type list list > type student hash > type id string > type zset zset
删除 list:
> del list 1 > keys * id STUDENT set2 zset set1 student mylist
4.0 在 Java 中操作 Redis
Redis 的 Java 客户端很多,常用的几种:Jedis、Lettuce、Spring Data Redis 。在 Spring Data Redis 是 Spring 的一部分,对 Redis 底层开发进行了高度封装,在 Spring 项目中,可以使用 Spring Data Redis 来简化操作。
4.1 Spring Data Redis 环境搭建
1)导入 Spring Data Redis 的 maven 坐标。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2)配置 Redis 数据源。
redis: host: localhost port: 6379 password: 123456 database: 0
host:主机号、port:端口号、password:密码、database:数据库。
这里的数据库指定是 Redis 中的数据库,一共有 16 个数据库,默认会自动选择 0 号的数据库。
3)编写配置类,创建 RedisTemplate 对象。
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; @Configuration public class RedisConfiguration { @Bean public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ //创建 redis 模板对象 RedisTemplate redisTemplate = new RedisTemplate(); //设置 redis 的连接工厂 redisTemplate.setConnectionFactory(redisConnectionFactory); //设置 redis key 的序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); return redisTemplate; } }
4)通过 RedisTemplate 对象操作 Redis 。
完成以上的步骤,就可以通过 RedisTemplate 对象来获取五种类型的操作对象了。
代码演示:
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.*; @SpringBootTest public class test { @Autowired RedisTemplate redisTemplate; @Test public void test(){ System.out.println(redisTemplate); //获取到 string 类型的操作对象 ValueOperations valueOperations = redisTemplate.opsForValue(); //获取到 hash 类型的操作对象 HashOperations hashOperations = redisTemplate.opsForHash(); //获取到 list 类型的操作对象 ListOperations listOperations = redisTemplate.opsForList(); //获取到 set 类型的操作对象 SetOperations setOperations = redisTemplate.opsForSet(); //获取到有序集合 zset 类型的操作对象 ZSetOperations zSetOperations = redisTemplate.opsForZSet(); } }
4.2 操作字符串类型的数据
常见的方法:
1)set(key,value):设置键值对 k v 。
2)set(key,value,timeout,unit):设置有效时间的键值对。
3)get(key):根据键来获取值。
4)setIfAbsent(key,value):设置一个键值对,只有在 key 不存在时设置 key 的值。
代码演示:
@Test public void test1(){ //先获取到操作字符串类型的对象 ValueOperations valueOperations = redisTemplate.opsForValue(); //设置键值对 k v valueOperations.set("cls","1"); //根据键来获取值 String cls = (String) valueOperations.get("cls"); //设置有效时间的键值对,设置一个有效时间为 3 分钟的键值对 valueOperations.set("code","123456",3, TimeUnit.MINUTES); //设置一个键值对,只有在 key 不存在时设置 key 的值 valueOperations.setIfAbsent("bee","2"); //因为已经存在bee键,所以值依然是3 valueOperations.setIfAbsent("bee","3"); }
运行结果:
4.3 操作哈希类型的数据
常见的方法:
1)put(key,field,value):新增数据。
2)get(key,field):获取数据。
3)keys(key):获取 key 中的全部字段。
4)values(key):获取 key 中的全部值。
5)delete(key,field):删除 key 中 field 的字段。
代码演示:
@Test public void test2(){ //先获取到操作哈希的对象 HashOperations hashOperations = redisTemplate.opsForHash(); //新增数据 hashOperations.put("student","id","1"); hashOperations.put("student","name","小扳手"); hashOperations.put("student","age","22"); //根据字段来获取值 String id = (String) hashOperations.get("student", "id"); String name = (String) hashOperations.get("student", "name"); System.out.println(id + " " + name); //获取student中的全部键 Set student = hashOperations.keys("student"); System.out.println(student); //获取student中的全部值 List student1 = hashOperations.values("student"); System.out.println(student1); //删除指定的字段 hashOperations.delete("student","age"); }
运行结果:
4.4 操作列表类型的数据
常见的方法:
1)leftPushAll(key,values):批量增加数据。
2)leftPush(key,value):新增数据。
3)range(key,start,end):获取指定范围的数据。
4)rightPop(key):删除最后一个数据。
5)size(key):获取列表中的数据个数。
代码演示:
@Test public void test3(){ ListOperations listOperations = redisTemplate.opsForList(); //批量增加数据 listOperations.leftPushAll("mylist","1","2","3"); //新增单个数据 listOperations.leftPush("mylist","4"); //获取范围内的数据 List mylist = listOperations.range("mylist", 0, -1); System.out.println(mylist); //删除最后一个数据 String date = (String) listOperations.rightPop("mylist"); System.out.println(date); //获取列表中的数据个数 Long len = listOperations.size("mylist"); System.out.println(len); }
运行结果:
4.5 操作集合类型的数据
常见的方法:
1)add(key,values):新增单个数据或者批量新增数据。
2)members(key):获取 Key 中的全部成员。
3)size(key):获取 key 中的成员个数。
4)intersect(key1,key2):获取两个集合中的交集。
5)union(key1,key2):获取两个集合中的并集。
6)remove(key,values):删除 key 中指定的 value ,可以是一个 value 也可以是多个 value 。
代码如下:
@Test public void test4(){ SetOperations setOperations = redisTemplate.opsForSet(); //批量新增数据 setOperations.add("set1","a","b","c"); setOperations.add("set2","a","x","y"); //获取key中的成员 Set member = setOperations.members("set1"); System.out.println(member); //获取key中的成员个数 Long len = setOperations.size("set2"); System.out.println(len); //两个集合的交集 Set intersect = setOperations.intersect("set1", "set2"); System.out.println(intersect); //获取两个集合的并集 Set union = setOperations.union("set1", "set2"); System.out.println(union); //删除成员 setOperations.remove("set1","c"); }
运行结果:
4.6 操作有序集合类型的数据
常见的方法:
1)add(key,value,score):新增数据。
2)range(key,start,end):获取指定范围的数据。
3)incrementScore(key,value,delta):给指定的数据的分数增加 dalta 。
4)remove(key,values):删除数据。可以删除单个数据,也可以批量删除数据。
代码演示:
@Test public void test5(){ ZSetOperations zSetOperations = redisTemplate.opsForZSet(); //新增数据 zSetOperations.add("z","a",10); zSetOperations.add("z","b",15); zSetOperations.add("z","c",20); //获取指定范围的数据 Set z = zSetOperations.range("z", 0, -1); System.out.println(z); //给指定的数据增加分数 zSetOperations.incrementScore("z","a",10); //删除数据 zSetOperations.remove("z","c"); }
运行结果:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)