基于Docker安装Redis
Redis 端口 6379
通过以下命令启动一个简单的Redis容器
docker run --name some-redis -d -p 6379:6379 redis:6.2.6
Java Client 测试
Java 中推荐使用Jedis实现对Redis的操作,参考文档 https://github.com/redis/jedis (使用Jedis连接Redis),https://redis.io/commands (Redis命令大全),https://www.cnblogs.com/GetcharZp/p/11455234.html(Redis常用命令)
导入maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.0.0</version>
</dependency>
编写单元测试
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class Redis {
/**
* 往string这一结构中设置并获取数据
*/
@Test
public void testString() {
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("name", "getchar");
System.out.println(jedis.get("name"));
// 删除 key
jedis.del("name");
}
/**
* Redis中的list可以看做双向链表
* 使用 lpush() rpop() 时为队列
* 使用 lpush() lpop() 时为栈
*/
@Test
public void testList() {
Jedis jedis = new Jedis("localhost", 6379);
jedis.lpush("q", "q1");
jedis.lpush("q", "q2");
jedis.lpush("q", "q3");
while (jedis.llen("q") > 0) {
System.out.println(jedis.rpop("q"));
}
}
/**
* Redis中使用set管理数据集合
* sadd() 往集合中新增一个数据(如果集合中已存在该元素则返回0,新增不成功)
* smembers() 获取数据集合
* srem() 移除集合中特定的元素
*/
@Test
public void testSet() {
Jedis jedis = new Jedis("localhost", 6379);
jedis.sadd("set", "key1");
jedis.sadd("set", "key2");
jedis.sadd("set", "key3");
// 已存在key3,该语句返回 0
jedis.sadd("set", "key3");
// 通过 smembers() 获取 set 集合
for (String set : jedis.smembers("set")) {
System.out.println(set);
}
// 移除set中特定的元素
jedis.srem("set", "key1");
}
/**
* Redis 中使用zset来管理有序集合
* zadd() 往有序集合中新增一个数据
* zrange() zrangeByScore() 获取有序集合列表
* zrem() 移除集合中特定的元素
*/
@Test
public void testZSet() {
Jedis jedis = new Jedis("localhost", 6379);
jedis.zadd("zset", 10, "key1");
jedis.zadd("zset", 5, "key2");
jedis.zadd("zset", 30, "key3");
// zrange 获取 [start, stop] 中的元素
for (String zset : jedis.zrange("zset", 0, 2)) {
System.out.println(zset);
}
// zrangeByScore 获取分数在 [min, max] 中的元素
for (String zset : jedis.zrangeByScore("zset", 5, 30)) {
System.out.println(zset);
}
// 移除有序集合中特定的元素
jedis.zrem("zset", "key3");
}
/**
* Redis 中使用hash来管理相应的键值数据
* hset 往hash中设置键值对
* hexists 判断键值是否存在
* hget 获取键对应的值
* hgetAll 获取所有的键值
* hdel 删除特定字段
*/
@Test
public void testHash() {
Jedis jedis = new Jedis("localhost", 6379);
HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
// 往hash中设置值
jedis.hset("hash", map);
// hexists 判断hash中对应的字段是否存在
System.out.println(jedis.hexists("hash", "key1"));
// hget 获取hash中对应字段的值
System.out.println(jedis.hget("hash", "key1"));
Map<String, String> map1 = jedis.hgetAll("hash");
for (Map.Entry<String, String> entry : map1.entrySet()) {
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
// 删除hash中特定的字段
jedis.hdel("hash", "key1");
}
}
SpringBoot中使用Redis
导入Redis启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置application.properties配置文件
spring.redis.host=localhost # 默认为localhost,如果为本地可以不用配置
编写单元测试,存储简单数据
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Objects;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringbootRedis {
@Autowired
private RedisTemplate<String, String> template;
@Test
public void testString() {
template.opsForValue().set("n1", "m1");
System.out.println(template.opsForValue().get("n1"));
}
@Test
public void testList() {
template.opsForList().leftPushAll("l1", "v1", "v2", "v3");
while (Objects.requireNonNull(template.opsForList().size("l1")) > 0) {
System.out.println(template.opsForList().rightPop("l1"));
}
}
@Test
public void testSet() {
template.opsForSet().add("s1", "k1", "k2", "k3");
for (String s1 : Objects.requireNonNull(template.opsForSet().members("s1"))) {
System.out.println(s1);
}
template.opsForSet().remove("s1", "k1");
for (String s1 : Objects.requireNonNull(template.opsForSet().members("s1"))) {
System.out.println(s1);
}
}
@Test
public void testZSet() {
template.opsForZSet().add("zs1", "k1", 10);
template.opsForZSet().add("zs1", "k2", 5);
template.opsForZSet().add("zs1", "k3", 20);
for (String zs1 : Objects.requireNonNull(template.opsForZSet().range("zs1", 0, 2))) {
System.out.println(zs1);
}
for (String zs1 : template.opsForZSet().rangeByScore("zs1", 10, 20)) {
System.out.println(zs1);
}
}
@Test
public void testHash() {
template.opsForHash().put("h1", "k1", "v1");
System.out.println(template.opsForHash().get("h1", "k1"));
}
}
存储对象(即序列化的数据)
当前springboot的版本为2.5.5,针对该版本操作Redis的时候可以直接使用上面内容的操作,暂不需要对序列化相关内容进行配置,参考代码:
实例类:
public class User implements Serializable {
private String name;
private Integer age;
private String password;
public User(String name, Integer age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
}
单元测试,相关包参考上面的 Java Client
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringbootRedis {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testSerializer() {
// redisTemplate.setKeySerializer(RedisSerializer.string());
User user = new User("name", 18, "password");
redisTemplate.opsForValue().set("user", user);
User user1 = (User) redisTemplate.opsForValue().get("user");
System.out.println(user1.toString());
}
@Test
public void testObjectList() {
User user = new User("name", 18, "password");
redisTemplate.opsForList().leftPushAll("u", user);
System.out.println(redisTemplate.opsForList().rightPop("u"));
}
}