1:简介
1.1:Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件,它存储的value类型比较丰富,也被称为结构化的NoSql数据库(非关系型数据库)。
1.2:Redis应用场景
- 缓存
- 任务队列
- 消息队列
- 分布式锁
2:Redis 5种常用数据类型
2.1:string 普通字符串
常用命令:
- SET key value:设置指定key的值
- GET kry:获取指定key的值
- SETEX key seconds value:设置指定key的值,并将key的过时时间设置为seconds秒
- SETNX key value:只有在key不存在时设置key的值
2.2:hash适合存储对象
Redis hash是一个string类型的field和value的映射表,适合存储对象
- HSET key field value:将哈希表key中的字段field的值设置为key
- HGET key field:获取存储在哈希表中指定字段的值
- HDEL key field:删除存储在哈希表中的指定字段
- HKEYS key:获取哈希表中所有字段
- HVALS key:获取哈希表中所有值
- HGETALL key:获取在哈希表中指定key的所有字段和值
2.3:列表list,按照插入顺序进行排序,可以有重复元素
- LPUSH key value1 [value2]将一个或多个值插入到列表头部
- LRANG key start stop:获取列表指定范围内的元素
- RPOP key:移除并获取列表最后一个元素
- LLEN key:获取列表长度
- BRPOP key1 [key2] timeout:移出并获取列表最后一个元素,如果列表没有元素会阻塞队列直到等待超时或者发现可弹出元素为止。
2.4:集合set,无序,没有重复元素
- SADD key member1 [member2]:向集合中添加一个或多个成员
- SMEMBERS key:返回集合中的所有成员
- SCARD key:获取集合的成员数
- SINTER key1 [key2]:返回给定所有集合的交集
- SUNION key1 [key2]:返回所有给定集合的并集
- SDIFF key1 [key2]:返回给定所有集合的差集
- SREM key member1 [member2]:移除集合中一个或者多个成员
2.5:有序集合sorted set,没有重复元素
- ZADD key score1 member1 [score2 member2] 向有序集合中添加一个或多个成员,或者更新已存在成员的分数
- ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合中指定区间内的成员
- ZINCRBY key increment member:有序集合中对指定成员的分数加上增量increment
- ZREM key member [member …]:移除有序集合中的一个或者多个成员
2.6:通用命令
- KEYS pattern:查找所有符合给定模式(pattern)的key
- EXISTS key:检查给定key是否存在
- TYPE key:返回key所存储的类型
- TTL key:返回给定key的剩余生存时间(time to live),以秒为单位
- DEL key:该命令用于在key存在时删除key
3:Java中使用Redis
3.1:导入坐标,配置相关文件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
spring: redis: host: localhost port: 6379 database: 0 jedis: pool: max-active: 8 #最大连接数 max-wait: 1ms #连接池最大阻塞等待时间 max-idle: 4 #连接池中的最大空闲连接 min-idle: 0 #连接池中的最小空闲连接
3.2:Spring Data Redis
Spring Data Redis中提供了一个高度封装的类:RedisTemplate、StringRedisTemplate,真针对jedis客户端中大量的api进行了归类封装,将同一类型操作封装为operation接口。RedisTemplate和StringRedisTemplate两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。他们的主要区别在于使用的序列化类上,RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。StringRedisTemplate使用的是StringRedisSerializer。如果要存储的是字符串,则使用StringRedisTemplate,如果要存储复杂的对象类型,则使用RedisTemplate。具体分类如下:
@SpringBootTest class ApplicationTests { @Autowired private StringRedisTemplate stringRedisTemplate; /** * 普通字符串类型 */ @Test void StringTest() { //普通字符串类型 //设置键值 stringRedisTemplate.opsForValue().set("username","zhangsan"); String username = stringRedisTemplate.opsForValue().get("username"); System.out.println(username); //存入数据并设置过期时间 stringRedisTemplate.opsForValue().set("password","asd123",10, TimeUnit.SECONDS); } /** * 哈希类型 */ @Test void HashTest(){ HashOperations<String, String, String> opsForHash = stringRedisTemplate.opsForHash(); opsForHash.put("user","name","zhangsan"); opsForHash.put("user","age","20"); opsForHash.put("user","addr","beijing"); //取值 String name = (String) stringRedisTemplate.opsForHash().get("user", "name"); System.out.println(name); // 获取所有字段 for (Object user : opsForHash.keys("user")) { System.out.println(user); } //获取所有值 List<Object> user = Collections.singletonList(opsForHash.values("user")); for (Object s : user) { System.out.println(s); } } /** * List操作 */ @Test void ListTest(){ ListOperations<String, String> opsForList = stringRedisTemplate.opsForList(); opsForList.leftPush("age","20"); opsForList.leftPushAll("age","30","40","50"); //获取所有值 List<String> age = opsForList.range("age", 0, -1); assert age != null; for (String s : age) { System.out.println(s); //50 40 30 20 } //出队列 Long size = opsForList.size("age"); assert size != null; int len = size.intValue(); for (int i = 0; i < len; i++) { //出队列 String Age = opsForList.rightPop("age"); System.out.println(Age); } } /** * 集合操作 */ @Test void setTest(){ SetOperations<String, String> opsForSet = stringRedisTemplate.opsForSet(); //添加元素 opsForSet.add("age","20","20","30","40"); //取值 for (String age : Objects.requireNonNull(opsForSet.members("age"))) { System.out.println(age); //20 30 40 } System.out.println("---------------------------"); //删除成员 opsForSet.remove("age","30"); Set<String> age = opsForSet.members("age"); assert age != null; for (String s : age) { System.out.println(s); //20 40 } } /** * ZSet有序集合 */ @Test void ZSetTest(){ ZSetOperations<String, String> opsForZSet = stringRedisTemplate.opsForZSet(); //添加元素 opsForZSet.add("myZSet","age1",10); opsForZSet.add("myZSet","age2",20); opsForZSet.add("myZSet","age3",30); opsForZSet.add("myZSet","age1",10); //取值 Set<String> myZSet = opsForZSet.range("myZSet", 0, -1); assert myZSet != null; for (String s : myZSet) { System.out.println(s); //age1 age2 age3 } System.out.println("----------------------"); //修改 opsForZSet.incrementScore("myZSet","age1",30); for (String zSet : Objects.requireNonNull(opsForZSet.range("myZSet", 0, -1))) { System.out.println(zSet); //age2 age3 age1 } System.out.println("---------------------"); //删除 opsForZSet.remove("myZSet","age1","age2"); for (String zSet : Objects.requireNonNull(opsForZSet.range("myZSet", 0, -1))) { System.out.println(zSet); //age3 } } /** * 通用操作 */ @Test void commonTest(){ //获取Redis中所有的key for (String key : Objects.requireNonNull(stringRedisTemplate.keys("*"))) { System.out.println(key); } System.out.println("--------------------"); //检查指定key是否存在 Boolean isExists = stringRedisTemplate.hasKey("username"); System.out.println(isExists); System.out.println("--------------------"); //删除指定key stringRedisTemplate.delete("username"); //获取指定key对应的value数据类型 DataType myZSet = stringRedisTemplate.type("myZSet"); System.out.println(myZSet.name()); } }