Redis基础操作

Hash数据类型

@Service
public class RedisHashService {


    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static final String HASH_KEY = "hashKey";

    @Data
    static
    class InnerTestClass {

        private String realName;

        private Integer sex;
    }

    public void sout() {

        redisTemplate.opsForHash().put(HASH_KEY, "id", 0);
        redisTemplate.opsForHash().put(HASH_KEY, "name", "sy");

        InnerTestClass innerTestClass = new InnerTestClass();

        innerTestClass.setRealName("cs");
        innerTestClass.setSex(1);

        redisTemplate.opsForHash().put(HASH_KEY, "inner", innerTestClass);

        System.out.println(redisTemplate.opsForHash().get(HASH_KEY, "id"));

        System.out.println(redisTemplate.opsForHash().get(HASH_KEY, "name"));

        System.out.println(redisTemplate.opsForHash().get(HASH_KEY, "inner"));

        System.out.println(redisTemplate.opsForHash().keys(HASH_KEY));

        List<Object> values = redisTemplate.opsForHash().values(HASH_KEY);

        values.forEach(item -> {

            if (item instanceof InnerTestClass) {
                System.out.println(JSON.toJSONString(item));
            } else {

                System.out.println("--" + item);

            }
        });

        System.out.println(redisTemplate.opsForHash().size(HASH_KEY));

        redisTemplate.opsForHash().delete(HASH_KEY, "id");

        System.out.println(redisTemplate.opsForHash().hasKey(HASH_KEY, "id"));
    }

}

List数据类型

@Service
public class RedisListService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static final String KEY = "listKey";

    public void test() {

        redisTemplate.delete(KEY);
        redisTemplate.delete("newKey");

        // 左侧插入数据
        redisTemplate.opsForList().leftPush(KEY, 1);

        // 左侧插入数据
        redisTemplate.opsForList().leftPush(KEY, 0);

        // 左侧插入数据
        redisTemplate.opsForList().leftPush(KEY, -1);

        // 右侧插入数据
        redisTemplate.opsForList().rightPush(KEY, 2);

        // 右侧插入数据
        redisTemplate.opsForList().rightPush(KEY, 3);

        //取出列表中的所有元素
        List<Object> list = redisTemplate.opsForList().range(KEY, 0, -1);

        System.out.println("此时列表数据为:" + list);

        System.out.println("从左侧取出并移除一个数据: " + redisTemplate.opsForList().leftPop(KEY));

        System.out.println("从右侧取出并移除一个数据: " + redisTemplate.opsForList().rightPop(KEY));

        System.out.println("输出索引下标为1 的数据: " + redisTemplate.opsForList().index(KEY, 1));

        System.out.println("从列表的右侧取出一条数据,并将此数据 newKey 左侧push: " + redisTemplate.opsForList().rightPopAndLeftPush(KEY, "newKey"));

        System.out.println("输出原list长度: " + redisTemplate.opsForList().size(KEY));

        System.out.println("输出newKey列表数据: " + redisTemplate.opsForList().range("newKey", 0, -1));
    }
}

一个简单的redis分布式锁实现

@Service
public class RedisLockService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;


    public void saveAndGet(String value) {

        redisTemplate.opsForValue().set("csValue", value);

        value = (String) redisTemplate.opsForValue().get("csValue");

        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        System.out.println(value);

    }

    public void setIfAbsent() {

        ExecutorService executorService = createExecutorService();

        executorService.execute(this::lockTest);

        executorService.execute(this::lockTest);
    }

    public void lockTest() {

        String lockKey = "lockKey";

        while (!Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, "0"))) {

            try {
                TimeUnit.MILLISECONDS.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            System.out.println("其他线程持有锁,请等待 当前线程:" + Thread.currentThread().getName());

        }

        saveAndGet(String.format("%s线程修改", Thread.currentThread().getName()));

        redisTemplate.delete(lockKey);
    }


    private ExecutorService createExecutorService() {

        ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("custom-thread-%d").build();

        return new ThreadPoolExecutor(4,
                10,
                1,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(10),
                factory);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值