其实说到redis,一个广泛流行的中间件。依稀记得当年还是小白的时候第一次听老板讲redis简直觉得神奇又神秘。依稀记得那是一个冬天,刚刚参加工作以前只知道spring,spring mvc,spring boot,mybatis等。然后第一份工作实习过后转正的日子里。老板让我看看redis和elasticsearch。然后云里雾里的自己学习。看了官网,记了笔记。但是对于中间件的理解还是一知半解。一次下班的晚上自觉加班学习。和老板闲聊时老板给我出了一个场景让我解决。就是一个2g服务器做秒杀活动怎么做?当时知识储汇少的可怜的我除了加服务器竟然无法可想。然后老板指点我说redis。至今我还记得那种初入神奇的知识海洋的激动和感叹。并在自己的u盘记录了几句心得。在此分享给大家。
2018.3.9记录其实在于现在的我来讲,这个言语和理解略有单纯和浅薄。可是这种心情却值得铭记和回忆。一般来讲我的文章都会写的心路历程和想法较多,并不是为了凑字数,而是希望不经意的某个想法能让某个新人看了豁然开朗或者学到些什么。我也是这么一点一滴过来的,反正于我而言很多时候看帖子真的纯干货的技术贴反而不太明白。我希望自己做到写的东西基础薄弱也能看懂。如果因此做的太满反而废话很多,对此感到抱歉。
闲不多谈继续说redis在java中的使用。
1,导包(因为我习惯用sb框架,所以这里用的也是data-redis)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2,配置文件中配置(!!还要注意一点,我这里是采用了redis的一主二从三哨兵模式。所以配置的也是哨兵。如果普通直连会更简单)
#因为是哨兵所以是redis.sentinel.master。名字是在redis中配置的。别盲目copy
spring.redis.sentinel.master=master001
spring.redis.password=XXXXX
#因为哨兵肯定多节点。。中间英文“,”分割
spring.redis.sentinel.nodes=192.168.1.106:26379,192.168.1.107:26379,192.168.1.108:26379
#超时时间啥的~~真的是千篇一律~~没啥说的了。下面的都可以省略的
spring.redis.timeout=5000
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.min-idle=0
spring.redis.pool.max-idle=8
3,配置完了之后就可以直接autowired注入使用了。这里必须感谢下spring家族的高度封装。这里是一个最简单的存取demo
package com.example.demo.redis;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisUtil {
@Autowired
StringRedisTemplate stringRedisTemplate;
public String setRedis(String key,String value) {
stringRedisTemplate.opsForValue().set(key, value, 50l,TimeUnit.SECONDS);
return "ok";
}
public String getRedis(String key) {
String value =stringRedisTemplate.opsForValue().get(key);
return value;
}
}
这里废话多一点加上延伸一点内容,一步步讲解下StringRedisTemplate:
-和redis中的数据类型是一样的。也分为五种,对应着不同的方法:
stringRedisTemplate.opsForValue(); //操作字符串
stringRedisTemplate.opsForHash(); //操作hash
stringRedisTemplate.opsForList(); //操作list
stringRedisTemplate.opsForSet(); //操作set
stringRedisTemplate.opsForZSet(); //操作有序set
-这里再声明一下redis中的数据类型:键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
对redis概念还不熟的童鞋可以参考下这份文档:Redis
其实我个人可能经历不足,所以一般用redis都是存储字符串的。哪怕是真的存别的数据类型。我也都是以json串的形式存储,取的时候再解析。
这里明确讲一下,上面方法获取的是redis中value是该类型的所有实例。例如下面:获取数据库中值是String类型的所有数据
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
然后我们在这个基础上可以添加,查询等:
ops.set(key,value); //向redis中插入数据。因为这个没有设置过期时间所以是永久存储的。
ops.set(key,value,time,timeUtil); //向redis中插入数据。第三个参数是一个long型的时间。最后一个参数是时间的单位。比如我上面demo中就是设置的50秒过期。
ops.get(key);//获取redis中指定key 的value值。
注意下上面的是针对字符串类型value的操作。如果是别的值类型操作是有一点点不同的,例如set:
stringRedisTemplate.opsForSet().add("keySet", "1","2","3"); //向指定key中存放set集合
stringRedisTemplate.opsForSet().isMember("keySet", "1"); //根据key查看集合中是否存在指定数据
stringRedisTemplate.opsForSet().members("keySet"); //根据key获取set集合
stringRedisTemplate还有一些别的方法:
stringRedisTemplate.expire(key,1000 , TimeUnit.MILLISECONDS); //设置过期时间
stringRedisTemplate.hasKey("isHas"); //检查key是否存在,返回boolean值
stringRedisTemplate.delete(key); //根据key删除记录
stringRedisTemplate.getExpire(key); //根据key获取过期时间
stringRedisTemplate.getExpire(key,TimeUnit.SECONDS); //根据key获取过期时间并换算成指定单位
差不多常用的就这些了吧。其实StringRedisTemplate是一个spring替我们封装好了的一个类。它继承自redisTemplate。具体区别啥的大众又没有实际意义的说:1,不共通。 2,使用的序列化类不同。你要是看到这就能看懂只能夸一句你很棒棒哦~~但是实际上要想深入了解我建议大家还是看看spring官网上的介绍。
还有就是redis涉及到发布订阅事务处理,集群设置之类的相对于存储比较深奥的东西,我建议大家还是先把官网的文档都读一遍。有不理解的再去单独查询。这里丢个官方手册地址:spring-data-redis。
然后如果有什么疑问或者觉得我说的哪里有问题欢迎留言或者私信指出。
全文手打~~这么不容易的写个文~~如果你觉得用到了理解了~留个言点个赞转个发什么的啊~
网友评论