学习了点redis的相关知识,记录一下。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
一、Redis常用数据类型
1、String:String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。
public Map testString() {
Map map = Maps.newHashMap();
stringRedisTemplate.opsForValue().set("1", "2");
// 设置超时一分钟
redisTemplate.opsForValue().set("55", "那", 1, TimeUnit.MINUTES);
String s = stringRedisTemplate.opsForValue().get("1");
String s1 = (String) redisTemplate.opsForValue().get("55");
logger.info("中文打印" + s + ":" + s1);
map.put("code", 200);
return map;
}
2、Hash
Hash的应用场景,比如我们要存储一个用户信息对象数据
public Map testHash() {
Map map = Maps.newHashMap();
map.put("code", 200);
HashOperations ops = stringRedisTemplate.opsForHash();
String key = "user";
if (!stringRedisTemplate.hasKey(key)) {
ops.put(key, "姓名", "吴晨轩");
ops.put(key, "年龄", "20");
ops.put(key, "sex", "男");
logger.info("set success");
} else {
logger.info("已经存在了 key is exist");
Map entries = ops.entries(key);
map.put("dat", entries);
}
return map;
}
3、List
list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
public Map testList() {
Map map = Maps.newHashMap();
map.put("code", 200);
ListOperations ops = stringRedisTemplate.opsForList();
String key = "name";
if (!stringRedisTemplate.hasKey(key)) {
ops.leftPush(key, "吴");
ops.leftPush(key, "宸");
ops.leftPush(key, "煊");
logger.info("set Success");
} else {
logger.info("key is exist");
Long size = ops.size(key);
// 从第几个到第几个读取
List list = ops.range(key, 0, size);
for (String value : list) {
logger.info("中文大一" + value);
}
}
return map;
}
4、Set
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。
public Map testSet() {
Map map = Maps.newHashMap();
map.put("code", 200);
SetOperations ops = stringRedisTemplate.opsForSet();
String key = "likes";
if (!stringRedisTemplate.hasKey(key)) {
Long add = ops.add(key, "sport", "bask", "test");
logger.info("set成功了" + add);
// 移除
ops.remove("likes", "test");
} else {
Set members = ops.members(key);
for (String value : members) {
logger.info(value);
}
}
return map;
}
5、Sorted Set
sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
public Map testSetSort() {
Map map = Maps.newHashMap();
map.put("code", 200);
ZSetOperations ops = stringRedisTemplate.opsForZSet();
String key = "foods";
if (!stringRedisTemplate.hasKey(key)) {
ops.add(key, "fruite", 0);
ops.add(key, "apple", 5);
ops.add(key, "test", 3);
ops.add(key, "read", 3);
} else {
Set sets = ops.rangeByScore(key, 0, 100);
for (String value : sets) {
logger.info(value);
}
}
return map;
}
二、Redis的高级应用
1.使用Redis解决分布式锁的问题
业务场景-抢购。一个典型的高并发问题,所需的最关键字段就是库存,在高并发的情况下每次都去数据库查询显然是不合适的,因此把库存信息存入Redis中,利用redis的锁机制来控制并发访问,是一个不错的解决方案。
设置锁:
public Boolean setLock(String lockStr, Long lockTime) {
// 给redis设置一个key,如果返回成功,说明拿到了锁。
if (redisTemplate.opsForValue().setIfAbsent(String.format(ApiConstant.LOCK, lockStr), "1")) {
// 给redis设置过期时间
redisTemplate.expire(String.format(ApiConstant.LOCK, lockStr), lockTime, TimeUnit.SECONDS);
return true;
}
return false;
}
解锁:
public Boolean unLock(String lockStr) {
redisTemplate.delete(String.format(ApiConstant.LOCK, lockStr));
return true;
}
结合业务场景的博客介绍:https://www.cnblogs.com/lcxdevelop/p/8308926.html