SpringData Redis 常见操作

Posted 路上的风景

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringData Redis 常见操作相关的知识,希望对你有一定的参考价值。

String类型:ValueOperations

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-redis.xml")
public class RedisStringTest {

    @Autowired
    private RedisTemplate redisTemplate;
    private ValueOperations<String, String> ops = null;

    @Before
    public void init() {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        ops = redisTemplate.opsForValue();
    }

    @Test
    public void testSet() {
        ops.set("name", "zhangsan");
        ops.set("sex", "男", 10, TimeUnit.SECONDS); // 有效时间10秒
        ops.set("name", "xx", 2); // 替换,索引从0开始 zhxxgsan
        // 当key不存在的时候,执行保存操作;当key存在的时候,什么都不做
        ops.setIfAbsent("name", "lily");
        // 批量保存
        Map map = new HashMap();
        map.put("name2", "fan2");
        map.put("name3", "fan3");
        map.put("name4", "fan4");
        ops.multiSet(map);
        // 追加 当key存在时,会执行追加操作;当key不存在时,会执行保存操作
        ops.append("name5", "fan5"); // 执行两次,结果:fan5fan5
    }

    @Test
    public void testGet() {
        // 根据key获取value
        String value = ops.get("name");
        System.out.println(value);
        // 首先根据key获取value,然后再根据value进行截取,从start位置截取到end位置[包含start和end],索引从0开始
        String name = ops.get("name", 2, 5);
        System.out.println(name);
        // 批量获取
        List<String> keys = new ArrayList<>();
        keys.add("name2");
        keys.add("name3");
        keys.add("name4");
        List<String> values = ops.multiGet(keys);
        for (String s : values) {
            System.out.println(s);
        }
        // 根据key获取value的长度
        Long size = ops.size("name");
        System.out.println(size);
    }

    @Test
    public void testIncrement() {
        ops.set("age", "20");
        ops.increment("age"); // 自增1
        System.out.println(ops.get("age")); // 21
        ops.increment("age", 5); // 自增5
        System.out.println(ops.get("age"));// 26
        ops.decrement("age"); // 自减
        System.out.println(ops.get("age")); // 25
    }

    /**
     * 注意:删除使用的是RedisTemplate(redisTemplate),而不是ValueOperations(ops)
     */
    @Test
    public void testDelete() {
        // 单个删除
        redisTemplate.delete("name2");
        // 批量删除
        List<String> keys = new ArrayList<>();
        keys.add("name3");
        keys.add("name4");
        keys.add("name5");
        redisTemplate.delete(keys);
    }
}

Hash类型:HashOperations

/**
 * 注意:实体类必须实现序列化接口
 */
public class Article implements Serializable {
    //作者
    private String author;
    //创建时间
    private Date createTime;
    //标题
    private String title;
    
    /************* get/set方法 *************/
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-redis.xml")
public class RedisHashTest {

    @Autowired
    private RedisTemplate redisTemplate;
    private HashOperations<String, String, Article> ops = null;

    @Before
    public void init() {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        ops = redisTemplate.opsForHash();
    }

    /**
     * 保存
     */
    @Test
    public void testPut() {
        Article article = new Article();
        article.setAuthor("猫腻");
        article.setTitle("将夜");
        article.setCreateTime(new Date());
        ops.put("article", "1", article);
        // ops.putAll(Map);
        // ops.putIfAbsent();
    }

    /**
     * 获取
     */
    @Test
    public void testGet() {
        // 判断hashkey是否存在
        Boolean flag = ops.hasKey("article", "2");
        System.out.println(flag);

        // 根据key和hashkey获取值
        Article article = ops.get("article", "1");
        System.out.println(article);

        // 根据key获取所有的hashkey
        Set<String> set = ops.keys("article");
        for (String s : set) {
            System.out.println(s);
        }

        // 根据key获取所有的值
        List<Article> list = ops.values("article");
        for (Article a : list) {
            System.out.println(a);
        }

        // 同时获取hashkey和value
        Map<String, Article> map = ops.entries("article");
        Set<Map.Entry<String, Article>> entries = map.entrySet();
        for (Map.Entry<String, Article> entry : entries) {
            System.out.println(entry.getKey() + "---" + entry.getValue());
        }
    }

    /**
     * 删除
     */
    @Test
    public void testDelete() {
        // 这里通过删除hashkey,来删除对应的值
        // 如果要把整个hash删除,参考String类型的 redisTemplate.delete(key);
        ops.delete("article", "1");
        // ops.delete("article", "1", "2", ...);
    }
}

List类型:ListOperations

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-redis.xml")
public class RedisListTest {

    @Autowired
    private RedisTemplate redisTemplate;
    private ListOperations<String, String> ops = null;

    @Before
    public void init() {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        ops = redisTemplate.opsForList();
    }

    /**
     * 添加
     */
    @Test
    public void testAdd() {
        // 从左边添加
        ops.leftPush("student", "lily");
        ops.leftPushAll("student", "小明", "小红", "小芳");
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        ops.leftPushAll("student", list);

        // 从右边添加
        ops.rightPush("student", "ddd");
        // ops.rightPushAll();
    }

    /**
     * 查询
     */
    @Test
    public void testGet() {
        String student = ops.index("student", 1); // 索引从0开始
        String student1 = ops.index("student", -1); // -1代表右边开始第一个元素
        String student2 = ops.index("student", -2); // -2代表右边开始第二个元素
        System.out.println(student);
        System.out.println(student1);
        System.out.println(student2);

        // 范围查询,包括开始索引和结束索引
        List<String> list = ops.range("student", 0, 3);
        System.out.println(list);
    }

    /**
     * 删除
     */
    @Test
    public void testRemove() {
        String student = ops.leftPop("student");
        System.out.println(student);
        String student1 = ops.rightPop("student");
        System.out.println(student1);

        // 弹出指定的元素
        // count > 0:删除左边起第几个等于指定值的元素
        // count < 0:删除右边起第几个等于指定值的元素
        // count = 0:删除所有等于value的元素
        ops.remove("student", 2, "小红");
    }
}

Set类型:SetOperations

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-redis.xml")
public class RedisSetTest {

    @Autowired
    private RedisTemplate redisTemplate;
    private SetOperations<String, String> ops = null;

    @Before
    public void init() {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        ops = redisTemplate.opsForSet();
    }

    @Test
    public void testAdd() {
        ops.add("person", "张三", "李四", "王五", "赵六");
        ops.add("person", "张三");
    }

    /**
     * 查询
     */
    @Test
    public void testFind() {
        Set<String> person = ops.members("person");
        for (String s : person) {
            System.out.println(s);
        }

        // 随机获取一个
        String s = ops.randomMember("person");
        System.out.println(s);
        // 随机获取多个(可能会重复)
        List<String> list = ops.randomMembers("person", 3);
        for (String name : list) {
            System.out.println(name);
        }
    }

    /**
     * 删除
     */
    @Test
    public void testRemove() {
        // 返回移除成功的个数
        Long count = ops.remove("person", "张三", "李四", "赵六");
        System.out.println(count);

        // 随机移除指定个数元素
        List<String> person = ops.pop("person", 2);
        System.out.println(person);
        String p = ops.pop("person");// 随机移除一个
        System.out.println(p);
    }

    /**
     * 多集合操作
     */
    @Test
    public void testMoreSet() {
        ops.add("names1", "zhangsan", "lisi", "wangwu");
        ops.add("names2", "zhangsan", "lisi", "zhaoliu");
        // 求交集
        Set<String> set1 = ops.intersect("names1", "names2");
        System.out.println(set1);
        // 求并集
        Set<String> set2 = ops.union("names1", "names2");
        System.out.println(set2);
        // 求差集
        Set<String> set3 = ops.difference("names1", "names2");
        System.out.println(set3); // wangwu
        Set<String> set4 = ops.difference("names2", "names1");
        System.out.println(set4); // zhaoliu
    }
}

ZSet类型:ZSetOperations

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-redis.xml")
public class RedisZSetTest {

    @Autowired
    private RedisTemplate redisTemplate;
    private ZSetOperations<String, String> ops = null;

    @Before
    public void init() {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        ops = redisTemplate.opsForZSet();
    }

    /**
     * 添加
     */
    @Test
    public void testAdd() {
        ops.add("student", "aaa", 40);
        ops.add("student", "bbb", 80);
        ops.add("student", "ccc", 60);
    }

    /**
     * 分数的增减
     */
    @Test
    public void testScore() {
        ops.incrementScore("student", "aaa", 60); // 增加60分
        ops.incrementScore("student", "bbb", -50); // 减少50分
    }

    /**
     * 查询一个元素
     */
    @Test
    public void testFindOne() {
        // 查询个人分数
        Double score = ops.score("student", "aaa");
        System.out.println(score);
        // 查询一个元素在集合中的排名  从0开始
        Long rank = ops.rank("student", "bbb");
        System.out.println(rank);
    }

    /**
     * 根据一个区间获取一个列表
     */
    @Test
    public void testFindList() {
        // 根据排名区间获取列表
        Set<String> set1 = ops.range("student", 1, 3);
        System.out.println(set1);

        Set<ZSetOperations.TypedTuple<String>> set2 = ops.rangeWithScores("student", 1, 3);
        for (ZSetOperations.TypedTuple<String> tuple : set2) {
            System.out.println(tuple.getValue() + "---" + tuple.getScore());
        }

        // 根据分数区间获取列表
        Set<String> set3 = ops.rangeByScore("student", 60, 90);
        System.out.println(set3);

        Set<ZSetOperations.TypedTuple<String>> set4 = ops.rangeByScoreWithScores("student", 60, 90);
        for (ZSetOperations.TypedTuple<String> tuple : set4) {
            System.out.println(tuple.getValue() + "--" + tuple.getScore());
        }
    }

    /**
     * 统计
     */
    @Test
    public void testCount() {
        // 统计一个集合中的元素
        Long zCard = ops.zCard("student");
        System.out.println(zCard);
        Long count = ops.count("student", 60, 90);

        // 根据一个分数区间统计元素数量
        System.out.println(count);
    }

    /**
     * 删除
     */
    @Test
    public void testRemove() {
        // 通过key--value删除   value允许传入多个
        Long remove = ops.remove("student", "aaa", "bbb");
        System.out.println(remove); // 返回成功删除的个数
        // 通过排名区间删除
        Long count1 = ops.removeRange("student", 1, 2);
        System.out.println(count1);
        // 通过分数区间删除
        Long count2 = ops.removeRangeByScore("student", 30, 60);
        System.out.println(count2);
    }
}

 

以上是关于SpringData Redis 常见操作的主要内容,如果未能解决你的问题,请参考以下文章

Day617.SpringData常见错误 -Spring编程常见错误

Spring Data操作Redis详解

SpringData-Redis发布订阅自动重连分析

看Spring Data如何简化数据操作

看Spring Data如何简化数据操作

Java 之SpringData Redis快速入门 以及( Redis快速入门安装和使用)