redis集成springboot操作(list,hash,set,zset,string)

hash

####hash####################################################
import com.csw.demoRedis.entity.User;
import com.google.gson.Gson;
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.StringRedisTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 1)对象存储,HSET KEY_NAME FIELD VALUE或者HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN。
 * <p>
 * 比如购物车的实现
 */
@SpringBootTest
public class HashTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 加入缓存
     */
    @Test
    public void test1() {
        HashMap map = new HashMap();
        map.put("aa", "aa");
        map.put("user", new User("张三", 1, "好").toString());
        map.put("int", "8");
        stringRedisTemplate.opsForHash().putAll("AA-hash", map);
    }

    /**
     * 获取一个key 的所有hashkey和value
     */
    @Test
    public void test2() {
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("AA-hash");
        for (Object o : entries.keySet()) {
            System.out.print("键】" + o);
            System.out.println("值】" + entries.get(o));
        }
    }

    /**
     * 验证指定key下面有没有hash key
     */
    @Test
    public void test3() {
        Boolean aa = stringRedisTemplate.opsForHash().hasKey("AA-hash", "aa");
        System.out.println("是否含有】" + aa);
    }

    /**
     * 获取指定key 的value值
     */
    @Test
    public void test4() {
        stringRedisTemplate.opsForHash().put("AA-hash", "userJson", new Gson().toJson(new User("张三", 1, "好")));
        Object aa = stringRedisTemplate.opsForHash().get("AA-hash", "userJson");
        User user = new Gson().fromJson((String) aa, User.class);
        System.out.println("获取到的值为]" + user.getName());

        int anInt = Integer.parseInt((String) stringRedisTemplate.opsForHash().get("AA-hash", "int"));
        System.out.println("获取到整形的值为]" + anInt);
    }

    /**
     * 删除指定hash 的hashkey并返回删除数量
     */
    @Test
    public void test5() {
        Long delete = stringRedisTemplate.opsForHash().delete("AA-hash", "aa", "int");
        System.out.println("删除的个数为]" + delete);
    }

    /**
     * 指定hash 的hashkey做增减操作
     * long 和double都可以
     */
    @Test
    public void test6() {
        Double aa = stringRedisTemplate.opsForHash().increment("AA-hash", "aa", 1.0);
        System.out.println("增加后的值】" + aa);
    }

    /**
     * 获取key 下面的所有hashkey
     */
    @Test
    public void test7() {
        Set<Object> keys = stringRedisTemplate.opsForHash().keys("AA-hash");
        for (Object o : keys) {
            System.out.println("hashkey】" + o);
        }
        List<Object> values = stringRedisTemplate.opsForHash().values("AA-hash");
        System.out.println("values】" + values.toString());
    }

    /**
     * 获取key 下面的所有hashkey键值对个数
     */
    @Test
    public void test8() {
        Long size = stringRedisTemplate.opsForHash().size("AA-hash");
        System.out.println("hashkey个数大小】" + size);
    }

}

list

####list#####################################################
import com.csw.demoRedis.entity.User;
import com.google.gson.Gson;
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.StringRedisTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 常用的数据结构实现
 * 消息流
 */
@SpringBootTest
public class ListTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 测试左右添加
     * 左添加
     * 左1,左2,右3 结果213
     */
    @Test
    public void test1() {
        List list = new ArrayList();
        for (int i = 8; i < 10; i++) {
            list.add(new User("名字" + i, i, "状态" + i));
        }
        stringRedisTemplate.opsForList().rightPush("AA-list", new Gson().toJson(list));
    }

    /**
     * 获取指定位置的值
     */
    @Test
    public void test2() {
        String index = stringRedisTemplate.opsForList().index("AA-list", 1);
        System.out.println("值为】" + index);
    }

    /**
     * 获取指定区间的值
     */
    @Test
    public void test3() {
        List<String> range = stringRedisTemplate.opsForList().range("AA-list", 1, 2);
        for (String str : range) {
            System.out.println("zhi】" + str);
        }
    }

    /**
     * 将一个参数值放到另一个的前面
     */
    @Test
    public void test4() {
        List list = new ArrayList();
        for (int i = 8; i < 10; i++) {
            list.add(new User("名字" + i, i, "状态" + i));
        }
        stringRedisTemplate.opsForList().leftPush("AA-list", new Gson().toJson(list), "放前面");
    }

    /**
     * 测试左右批量添加
     */
    @Test
    public void test5() {
        stringRedisTemplate.opsForList().leftPushAll("AA-list", "aa", "bb", "cc");
        stringRedisTemplate.opsForList().rightPushAll("AA-list", "aa1", "bb1", "cc1");

    }

    /**
     * 测试集合大小
     */
    @Test
    public void test6() {
        Long size = stringRedisTemplate.opsForList().size("AA-list");
        System.out.println("大小为】" + size);
    }

    /**
     * 测试左移除,右移除
     * 移除左边第一个元素
     */
    @Test
    public void tes7() {
        stringRedisTemplate.opsForList().leftPop("AA-list");
    }

    /**
     * 测试左移除,右移除
     * 移除左边第一个元素,如果超过等待时间没有就退出
     */
    @Test
    public void tes8() {
        stringRedisTemplate.opsForList().leftPop("AA-list", 1, TimeUnit.MINUTES);
    }

    /**
     * 保留列表特定区间的元素
     */
    @Test
    public void tes9() {
        stringRedisTemplate.opsForList().trim("AA-list", 2, 7);
    }


}

set

####set#####################################################
import com.csw.demoRedis.entity.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.StringRedisTemplate;

import java.util.List;
import java.util.Set;

/**
 * 1)抽奖
 * 2)点赞、收藏、标签
 * 3)关注模型
 */
@SpringBootTest
class SetTest {
    private static final String AA = "aa_set";
    private static final String BB = "bb_set";
    private static final String VALUE = "花好月圆的缘故都给我465dffgy";
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 将值放入set中
     */
    @Test
    public void test1() {
        stringRedisTemplate.opsForSet().add(AA, BB);
    }

    /**
     * 获取set中的值
     */
    @Test
    public void test2() {
        stringRedisTemplate.opsForSet().add(AA, BB);
        Set<String> members = stringRedisTemplate.opsForSet().members(AA);
        for (String str : members) {
            System.out.println("set中的值】" + str);
        }
    }

    /**
     * 随机获取变量中指定个数的元素
     * 获取会出现重复
     */
    @Test
    public void test3() {
        stringRedisTemplate.opsForSet().add(AA + "3", "aa", "bb", "cc", "dd", "ee");
        //不会删除
        List<String> members = stringRedisTemplate.opsForSet().randomMembers(AA + "3", 4);
        //会删除
        //stringRedisTemplate.opsForSet().pop("AA" + 3, 2);
        for (String str : members) {
            System.out.println("set中的值】" + str);
        }
    }

    /**
     * 随机获取变量的元素(一个)
     */
    @Test
    public void test4() {
        stringRedisTemplate.opsForSet().add(AA + "3", "aa", "bb", "cc", "dd", "ee");
        String member = stringRedisTemplate.opsForSet().randomMember(AA + "3");
        System.out.println("set中的值】" + member);

    }

    /**
     * 弹出变量中的元素(弹出之后相当于就删掉了)
     */
    @Test
    public void test5() {
        String pop = stringRedisTemplate.opsForSet().pop(AA + "3");
        System.out.println("弹出了】" + pop);

    }

    /**
     * 获取变量中值的长度
     */
    @Test
    public void test6() {
        Long size = stringRedisTemplate.opsForSet().size(AA + "3");
        System.out.println("值的长度】" + size);
    }

    /**
     * 判断value在某个key中是否存在
     */
    @Test
    public void test7() {
        User user = new User("张三", 1, "好");
        stringRedisTemplate.opsForSet().add(AA + "3", user.toString());
        Boolean dd = stringRedisTemplate.opsForSet().isMember(AA + "3", user.toString());
        System.out.println("是否存在】" + dd);
    }

    /**
     * 判断是否转移成功
     */
    @Test
    public void test8() {
        User user = new User("张三", 1, "好");
        Boolean move = stringRedisTemplate.opsForSet().move(AA + 3, user.toString(), BB + 3);
        System.out.println("是否转移成功】" + move);
    }

    /**
     * 批量移除set中的元素
     */
    @Test
    public void test9() {
        Long remove = stringRedisTemplate.opsForSet().remove(AA + 3, "aa", "bb", "cc", "dd", "ee");
        System.out.println("成功移除了几个】" + remove);
    }

    /**
     * 通过给定的key求差值
     * 差值为】[cc]
     * 交集为】[bb, aa]
     * 合集为】[cc, bb, User(name=张三, id=1, status=好), aa]
     */
    @Test
    public void test10() {
        User user = new User("张三", 1, "好");
        stringRedisTemplate.opsForSet().add(BB + "3", "aa", "bb", user.toString());
        stringRedisTemplate.opsForSet().add(AA + "3", "aa", "bb", "cc");
        //左边有,右边没有的
        Set<String> difference = stringRedisTemplate.opsForSet().difference(AA + 3, BB + 3);
        System.out.println("差值为】" + difference.toString());
        //求合集
        Set<String> intersect = stringRedisTemplate.opsForSet().intersect(AA + 3, BB + 3);
        System.out.println("交集为】" + intersect.toString());
        //求合集
        Set<String> union = stringRedisTemplate.opsForSet().union(AA + 3, BB + 3);
        System.out.println("合集为】" + union.toString());
    }

}

string

####string###################################################
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.StringRedisTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 1)单值存储,相当于java的map;比如需要做密钥的缓存,set指令
 * <p>
 * 2)计数器,比如统计阅读数,incr指令
 * <p>
 * 3)分布式锁,分布式系统有一个问题是多机导致的同步锁问题,使用redis统一控制锁就简单多了。比如使用redisson获取写锁,注意过期时间的问题。set指令
 * <p>
 * 4)分库时批量申请全局序列号,INCRBY KEY_NAME INCR_AMOUNT指令
 */
@SpringBootTest
class StringTest {
    private static final String AA = "aa";
    private static final String BB = "bb";
    private static final String VALUE = "花好月圆的缘故都给我465dffgy";
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * //设置一个key并设置过期时间
     */
    @Test
    public void test1() {
        stringRedisTemplate.opsForValue().set(AA, VALUE, 1, TimeUnit.MINUTES);
    }

    /**
     * //设置一个key(可设置可不设置,建议同时设置),随后设置过期时间
     */
    @Test
    public void test2() {
        stringRedisTemplate.opsForValue().set(BB, VALUE);
        stringRedisTemplate.expire(AA, 1, TimeUnit.MINUTES);
    }

    /**
     * //查看一个key剩余过期时间,如果是永不失效就重新设置过期时间
     */
    @Test
    public void test3() {
        Long expireTime = stringRedisTemplate.getExpire(BB, TimeUnit.MINUTES);
        System.out.println("剩余过期时间】" + expireTime);
        if (expireTime == -1) {
            stringRedisTemplate.expire(BB, 1, TimeUnit.MINUTES);
        }
    }

    /**
     * //判断一个key是否存在
     */
    @Test
    public void test4() {
        Boolean aBoolean = stringRedisTemplate.hasKey(AA);
        System.out.println("key存在吗】" + aBoolean);
    }

    /**
     * //移除指定key的过期时间
     */
    @Test
    public void test5() {
        stringRedisTemplate.opsForValue().set(AA, VALUE, 1, TimeUnit.MINUTES);
        stringRedisTemplate.boundValueOps(AA).persist();
    }

    /**
     * 根据key获取值
     */
    @Test
    public void test6() {
        stringRedisTemplate.opsForValue().set(AA, VALUE, 1, TimeUnit.MINUTES);
        //不存在aa则为null
        String aa = stringRedisTemplate.opsForValue().get(BB);
        System.out.println("获取到的值为】" + aa);
    }

    /**
     * 批量添加key
     */
    @Test
    public void test7() {
        Map map = new HashMap();
        map.put("aa", "aa1");
        map.put("bb", VALUE);
        map.put("啊哈", VALUE);
        stringRedisTemplate.opsForValue().multiSet(map);
    }

    /**
     * 批量添加key,只有当map中的key都不存在时
     */
    @Test
    public void test8() {
        Map map = new HashMap();
        map.put("aa1", "aa1");
        map.put("bb1", VALUE);
        map.put("啊哈1", VALUE);
        stringRedisTemplate.opsForValue().multiSetIfAbsent(map);
    }

    /**
     * 对一个 key-value 的值进行加减操作,
     * 如果该 key 不存在 将创建一个key 并赋值该 number
     * 如果 key 存在,但 value 不是长整型 ,将报错
     */
    @Test
    public void test9() {
        //每次加1
        stringRedisTemplate.opsForValue().increment(BB);
        //每次加10
        stringRedisTemplate.opsForValue().increment(AA, 10);
        stringRedisTemplate.opsForValue().decrement(AA, 1);

    }


}

zset

####zset####################################################
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.StringRedisTemplate;

import java.util.Set;

/**
 * 1)有序的点赞,时间戳作为分值
 * <p>
 * 2) 排行榜
 */
@SpringBootTest
public class ZsetTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 添加元素
     */
    @Test
    public void test1() {
        stringRedisTemplate.opsForZSet().add("AA-zset", "aa", 9);
        stringRedisTemplate.opsForZSet().add("AA-zset", "bb", 4);
        stringRedisTemplate.opsForZSet().add("AA-zset", "cc", -3);
        stringRedisTemplate.opsForZSet().add("AA-zset", "dd", 28);
        stringRedisTemplate.opsForZSet().add("AA-zset", "ee", 5);

    }

    /**
     * 返回元素的个数
     */
    @Test
    public void test2() {
        Long size = stringRedisTemplate.opsForZSet().size("AA-zset");
        System.out.println("元素的个数为】" + size);
    }

    /**
     * 升序,降序返回键值
     * 升序】[cc, bb, ee, aa, dd]
     * 降序】[dd, aa, ee, bb, cc]
     */
    @Test
    public void test3() {
        Set<String> range = stringRedisTemplate.opsForZSet().range("AA-zset", 0, -1);
        System.out.println("升序】" + range.toString());
        Set<String> strings = stringRedisTemplate.opsForZSet().reverseRange("AA-zset", 0, -1);
        System.out.println("降序】" + strings.toString());
    }

    /**
     * 按照分数查询一个范围内的元素,返回默认升序
     * 按照分数范围查询】[bb, ee, aa]
     */
    @Test
    public void test4() {
        Set<String> range = stringRedisTemplate.opsForZSet().rangeByScore("AA-zset", 0, 10);
        System.out.println("按照分数范围查询】" + range.toString());
    }

    /**
     * 返回排名
     * 排名是】3
     * 倒叙排名是】1
     */
    @Test
    public void test5() {
        Long aa = stringRedisTemplate.opsForZSet().rank("AA-zset", "aa");
        System.out.println("排名是】" + aa);
        Long aa1 = stringRedisTemplate.opsForZSet().reverseRank("AA-zset", "aa");
        System.out.println("倒叙排名是】" + aa1);
    }

    /**
     * 显示一个元素的分数
     */
    @Test
    public void test6() {
        Double aa = stringRedisTemplate.opsForZSet().score("AA-zset", "aa");
        System.out.println("分数是】" + aa);
    }

    /**
     * 移除某一个元素
     */
    @Test
    public void test7() {
        stringRedisTemplate.opsForZSet().remove("AA-zset", "bb");
    }

    /**
     * 给一个特定的元素加分,不存在就会创建
     */
    @Test
    public void test8() {
        stringRedisTemplate.opsForZSet().incrementScore("AA-zset", "bb", 1);
    }

}

redis事务/原子性操作https://www.jianshu.com/p/460d952937c1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容