首页 > 数据库 >redis工具类-说明文档

redis工具类-说明文档

时间:2022-11-27 19:23:26浏览次数:38  
标签:Code return String redis redisKey 文档 key 工具 public

redis工具类-说明文档

一、键值设计


 1、key 名设计

可读性和可管理性

以业务名 (或数据库名) 为前缀(防止 key 冲突),用冒号分隔,比如业务名: 表名: id

1 ugc:video:1

简洁性

保证语义的前提下,控制 key 的长度,当 key 较多时,内存占用也不容忽视,例如:

1 user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}

不要包含特殊字符

反例:包含空格、换行、单双引号以及其他转义字符

2、value 设计

拒绝 bigkey

防止网卡流量、慢查询,string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000。

反例:一个包含 200 万个元素的 list。

非字符串的 bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止 bigkey 过期时间自动删除问题 (例如一个 200 万的 zset 设置 1 小时过期,会触发 del 操作,造成阻塞,而且该操作不会不出现在慢查询中 (latency 可查)),查找方法和删除方法

选择适合的数据类型

例如:实体类型 (要合理控制和使用数据结构内存编码优化配置, 例如 ziplist,但也要注意节省内存和性能之间的平衡)

反例:

1 set user:1:name tom
2 set user:1:age 19
3 set user:1:favor football

正例:

1 hmset user:1 name tom age 19 favor football

控制 key 的生命周期

redis 不是垃圾桶,建议使用 expire 设置过期时间 (条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注 idletime。

二、说明文档


 

1、【写】存放key,并设置存活时间  value为字符串

1 public void set(String key, String obj, long liveSeconds) {
2     redisTemplate.opsForValue().set(key, obj, liveSeconds, TimeUnit.SECONDS);
3 }
View Code

2、【写】存放key,设置存活时间   value为泛型对象

1 public void set(String key, T value, long liveSeconds) {
2     String saveObjectString = JSON.toJSONString(value);
3     set(key, saveObjectString, liveSeconds);
4 }
View Code

3、【写】存放key  value为字符串

1 public void set(String key, String obj) {
2     redisTemplate.opsForValue().set(key, obj);
3 }
View Code

4、【读】获取key,返参为字符串

 1 public String get(String key) {
 2     Object result = redisTemplate.opsForValue().get(key);
 3     if (result == null) {
 4         return null;
 5     }
 6     if (result instanceof String) {
 7         return (String) redisTemplate.opsForValue().get(key);
 8     }
 9     return JSON.toJSONString(result);
10 }
View Code

5、【读】获取key,返参为泛型对象

1 public <T> Object getObject(final String key, final Class<T> clazz) {
2     String result = get(key);
3     if (StringUtils.isBlank(result)) {
4         return null;
5     }
6     return JSON.parseObject(result, clazz, Feature.OrderedField);
7 }
View Code

6、【读】获取key,返参为泛型对象的集合

1 public <T> List<T> getArray(String key, Class<T> clazz) {
2     String result = get(key);
3     return result != null ? JSON.parseArray(result, clazz) : null;
4 }
View Code

7、【写】删除key的数据

1 public void delete(String key) {
2     redisTemplate.delete(key);
3 }
View Code

8、【写】对指定key进行尝试加锁(在指定时间内获取到锁返回true,获取不到返回false)

 1 public boolean tryLock(String redisKey, Object redisValue, Long lockMilliSecond) {
 2     if (lockMilliSecond == null) {
 3         lockMilliSecond = 1000L;// 默认1s
 4     }
 5     synchronized (redisKey.intern()) {
 6         if (redisTemplate.execute((RedisCallback<Boolean>) redisConnection -> {
 7             //定义序列化方式
 8             Jackson2JsonRedisSerializer<Object> serializer = (Jackson2JsonRedisSerializer<Object>) redisTemplate.getDefaultSerializer();
 9             byte[] value = serializer.serialize(redisValue.toString());
10             return redisConnection.setNX(redisKey.getBytes(), value);
11         })) {
12             //设置超时时间,释放内存
13             redisTemplate.expire(redisKey, lockMilliSecond, TimeUnit.MILLISECONDS);
14             return true;
15         } else {
16             return false;
17         }
18     }
19 }
View Code

9、【写】对指定key进行加锁,设置默认值

1 public boolean tryLock(String redisKey, Long lockMilliSecond) {
2     return tryLock(redisKey, redisKey, lockMilliSecond);
3 }
View Code

10、【写】获取指定key的锁,在指定时间范围内

 1 public boolean getRedisLock(String redisKey, Object redisValue, Long lockMilliSecond) throws Exception {
 2 
 3     synchronized (redisKey.intern()) {
 4 
 5         // 系统当前时间,毫秒
 6 
 7         long nowTime = System.currentTimeMillis();
 8 
 9         while (System.currentTimeMillis() - nowTime < lockMilliSecond + 10) {
10 
11             if (tryLock(redisKey, redisValue, lockMilliSecond)) {
12 
13                 return true;
14 
15             }
16 
17             // 每次请求等待一段时间
18 
19             Thread.sleep(10);
20 
21         }
22 
23         return false;
24 
25     }
26 
27 }
View Code

11、【写】释放锁,删除指定key的数据

1 public void releaseLock(String key) {
2 
3     redisTemplate.delete(key);
4 
5 }
View Code

12、【读】判断key是否存在

1 public Boolean hasKey(String redisKey,String hashKey){
2 
3     return redisTemplate.opsForHash().hasKey(redisKey,hashKey);
4 
5 }
View Code

13、【写】往List头部中追加值-单个

1 public Long leftPush(String redisKey,Object value){
2 
3     return redisTemplate.opsForList().leftPush(redisKey,value);
4 
5 }
View Code

14、【写】往List中头追加值-集合(注意集合类型)

1 public Long leftPush(String redisKey,Object value){
2 
3     return redisTemplate.opsForList().leftPushAll(redisKey,value);
4 
5 }
View Code

15、【写】往List尾部中追加值-单个

1 public Long rightPush(String redisKey,Object value){
2 
3     return redisTemplate.opsForList().rightPush(redisKey,value);
4 
5 }
View Code

16、【写】往List尾部中追加值-集合(注意集合类型)

1 public Long rightPushAll(String redisKey,Object value){
2 
3     return redisTemplate.opsForList().rightPushAll(redisKey,value);
4 
5 }
View Code

17、【读】获取List中的头部数据

1 public Object leftPop(String redisKey){
2 
3     return redisTemplate.opsForList().leftPop(redisKey);
4 
5 }
View Code

18、【读】获取List中的尾部数据

1 public Object rightPop(String redisKey){
2 
3     return redisTemplate.opsForList().rightPop(redisKey);
4 
5 }
View Code

19、【写】设置key过期时间

1  public Boolean expire(String redisKey,long liveTime,TimeUnit timeUnit){
2 
3     return this.redisTemplate.expire(redisKey,liveTime,timeUnit);
4 
5 }
View Code

20、【写】修剪现有列表,使其只包含指定的指定范围的元素,起始和停止都是基于0的索引:

1 public List<Object> lrange(String key, long start, long end){
2 
3     return redisTemplate.opsForList().range(key,start,end);
4 
5 }
View Code

21、【写】设置key +1

1 public long incr(String key){
2 
3     return redisTemplate.opsForValue().increment(key,1);
4 
5 }
View Code

22、【写】设置key -1

1 public long decr(String key){
2 
3     return redisTemplate.opsForValue().increment(key, -1);
4 
5 }
View Code

23、【写】设置kry过期时间

1 public void expireAt(String key,long unixTime){
2 
3     redisTemplate.expireAt(key,new Date(unixTime));
4 
5 }
View Code

标签:Code,return,String,redis,redisKey,文档,key,工具,public
From: https://www.cnblogs.com/guoguochong/p/16930376.html

相关文章

  • 经典DDoS攻击工具的实现原理
    1.GoldenEyeGoldenEye是流行的HTTP拒绝服务工具之一。它使用KeepAlive(和Connection:keep-alive)与缓存控制选项相结合,通过缓存(如果可能)持久化套接字连接破坏,直到消耗所有......
  • windows下安装redis
    1.安装包安装1)下载安装包下载地址:https://github.com/rgl/redis/downloads,选择msi后缀的文件下载。2)安装打开下载好的安装包,按提示步骤一路安......
  • Android切片工具
    实现将内存切片保存位本地文件中。文中仅提供实现的方法,不考虑其他外部因素。fundump():Boolean{//文件夹名vallogPathDir="/dump.mat/"varbool......
  • 河北工程大学-校内文档下载方法
    校内文档是指河北工程大学学位论文库内的文档根据学校的相关表述:【链接地址】http://202.206.163.227/Thesis65/(镜像)【访问方式】校园网用户直接访问【揭示深度】全......
  • web性能分析与测试工具介绍
    你是否有过以下一些经历?  面试中    说一下做过哪些性能优化?    从输入url到看到页面内容经历了哪些过程?什么是web性能?简单来说就是网站是不是够快......
  • Java使用Pipeline对Redis批量读写(hmset&hgetall)
    一般情况下,RedisClient端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client。这有点类似于HBase的Scan,通常......
  • linux卸载redis
    linux卸载redis的方法:1、打开终端命令行模式;2、输入以下命令查看reids是否在运行;3、将redis-server服务停止;4、删除/usr/local/lib目录下与redis相关的文件;5、删除掉......
  • Prometheus监控之redis_exporter
    一、下载安装1、下载https://github.com/oliver006/redis_exporter/releases/tag/v1.44.02、安装配置1、安装redis_exportertar-zxvfredis_exporter-v1.44.0.linux-amd64.......
  • redis 安装报错 jemalloc/jemalloc.h: No such file or directory
    redis第一次编译的时候没有gcc工具报错安装完gcc后再次编译就报错:"jemalloc/jemalloc.h:Nosuchfileordirectory"正确解决办法(针对2.2以上的版本)清理上次编译残留文件......
  • 微服务SpringBoot 整合Redis 实现点赞、点赞排行榜
    文章目录​​⛅引言​​​​一、发布探店笔记​​​​二、查看探店笔记​​​​三、SpringBoot整合Redis实现点赞功能​​​​四、SpringBoot整合Redis实现点赞排行......