本文涵盖了Redis的各种数据结构和命令,Redis的各种常见Java客户端的应用和最佳实践
jedis案例github地址:https://github.com/whltaoin/fedis_java_demo SpringbootDataRedis案例github地址:https://github.com/whltaoin/springbootDataRedis_demo
2. NoSQL数据间是**<font style="color:#DF2A3F;">无关联</font>**的,(下图为存储方式)
2. NoSQL没有固定的语法,每个NoSQL都有自己的语法糖(下图为查询同一个东西,出现了不同的语法)
Redis(远程词典服务器),是一个基于内存的**键值型NoSQL**数据库
忽略…
help @generic
# 语法
keys +[pattern]
del [key]
删除一个或多个示例
exists [key]
判断单个和多个示例
expire [key] [seconds]
ttl key
示例:设置age1的有效期为10s,到期后自动删除
heima:user:1
herma:product:1
层级结构:
2. hget
3. hmset
4. hmget
5. hgetall
6. hkeys
7. hvals
8. hincrby
9. hsetnx(已存在,不新建)
1. 示例:
1. 示例
2. 求并集(sunion):所有元素合并
3. 求差集(sdiff):set中有,但是set2中没有
1. 张三的好友人数
2. 张三和李四的共同好友
3. 查询那些人是张三的好友但是不是李四的好友
4. 查询张三和李四的共同好友
5. 判断李四是否是张三的好友
6. 判断张三是否是李四的好友
7. 将李四从张三的好友列表中移除
1. 添加数据
2. 删除Tom
3. 获取Amy分数
4. 获取Rose排名
5. 查询80分以上人数
6. 给Amy加2分
7. 查询排名前三的同学
8. 查询80以下的同学
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>jedis-test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 核心-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>6.0.0</version>
</dependency>
<!-- 测试类-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
b. 测试类方法内容
package cn.varin;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
private Jedis jedis;
@Before
public void init(){
jedis = new Jedis("ip",6379);
jedis.auth("密码");
jedis.select(0);
}
@Test
public void StringTest(){
String set = jedis.set("name", "varin");
System.out.println("执行set后结果为:"+set);
String name = jedis.get("name");
System.out.println("key为name的value为:"+name);
}
@After
public void close(){
if(jedis !=null){
jedis.close();
}
}
}
3. 执行结果
package cn.varin.jedis.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
// Jedis连接池对象
public class JedisConnectionFactory {
//
static public final JedisPool jedisPool;
static {
// 创建配置
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接数
jedisPoolConfig.setMaxTotal(10);
// 最大空闲数
jedisPoolConfig.setMaxIdle(10);
// 最小空闲数
jedisPoolConfig.setMinIdle(2);
// 空闲等待时间
jedisPoolConfig.setMaxWaitMillis(1000);
jedisPool = new JedisPool(jedisPoolConfig,"host",6379,100,"password");
}
public static Jedis getResource(){
return jedisPool.getResource();
}
}
2. 测试类代码
package cn.varin;
import cn.varin.jedis.utils.JedisConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
private Jedis jedis;
@Before
public void init(){
jedis = JedisConnectionFactory.getResource();
jedis.select(0);
}
@Test
public void StringTest(){
String set = jedis.set("name", "varya");
System.out.println("执行set后结果为:"+set);
String name = jedis.get("name");
System.out.println("key为name的value为:"+name);
}
@After
public void close(){
if(jedis !=null){
jedis.close();
}
}
}
3. 执行结果:
github示例案例地址:https://github.com/whltaoin/springbootDataRedis_demo
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.varin</groupId>
<artifactId>springbootDataRedis_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springbootDataRedis_demo</name>
<description>springbootDataRedis_demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- springbootDataRedis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
spring:
data:
redis:
port: 6379
password: password
database: 0
lettuce:
pool:
max-active: 10
max-idle: 10
min-idle: 0
max-wait: 100ms
host: address
package cn.varin.springbootdataredis_demo;
import cn.varin.springbootdataredis_demo.pojo.User;
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.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
@SpringBootTest
class SpringbootDataRedisDemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Test
void setTest() {
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("user:1",new User("varin",1).toString());
Object o = valueOperations.get("user:1");
System.out.println(o);
}
}
1. 在我们直接使用redisTemplate时,存入到redis的内容,是经过编译的字节,
2. 影响阅读性
3. 增加了存储空间
package cn.varin.springbootdataredis_demo.config;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisTamplateConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(factory);
// 创建序列化工具
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 对key
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 对value
template.setValueSerializer(genericJackson2JsonRedisSerializer);
template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
return template;
}
}
测试类
package cn.varin.springbootdataredis_demo;
import cn.varin.springbootdataredis_demo.pojo.User;
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.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
@SpringBootTest
class SpringbootDataRedisDemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Test
void setTest() {
ValueOperations valueOperations = redisTemplate.opsForValue();
// value为user对象
valueOperations.set("user:2",new User("varin",1));
Object o = valueOperations.get("user:1");
System.out.println(o);
}
}
@Autowired
StringRedisTemplate stringRedisTemplate;
// 用于转Json格式
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void StringRedisTamplateTest() throws JsonProcessingException {
User user = new User("varya",1);
// 转JSON格式
String s = mapper.writeValueAsString(user);
// 写入数据
stringRedisTemplate.opsForValue().set("user:3",s);
// 读取数据
String s1 = stringRedisTemplate.opsForValue().get("user:3");
// 反序列化
User user1 = mapper.readValue(s1, User.class);
System.out.println(user1);
}