RedisUtils工具类

RedisUtils工具类,第1张

package comchenutils;

import orgspringframeworkbeansfactoryannotationAutowired;

import orgspringframeworkbeansfactoryannotationQualifier;

import orgspringframeworkdatarediscoreRedisTemplate;

import orgspringframeworkstereotypeComponent;

import orgspringframeworkutilCollectionUtils;

import javautilCollection;

import javautilList;

import javautilMap;

import javautilSet;

import javautilconcurrentTimeUnit;

@Component

public final class RedisUtil {

@Autowired

private RedisTemplate redisTemplate;

/

指定缓存失效时间

@param key 键

@param time 时间(秒)

@return

/

public boolean expire(String key,long time){

try {

if (time > 0){

redisTemplateexpire(key,time, TimeUnitSECONDS);

}

return true;

}catch (Exception e){

return false;

}

}

/

根据key 获取过期时间

@param key 键 不能为null

@return 时间(秒)返回0代表永久有效

/

public long getExpire(String key){

return redisTemplategetExpire(key,TimeUnitSECONDS);

}

/

判断key 是否存在

@param key 键

@return ture 存在 false不存在

/

public boolean hasKey(String key){

try {

return redisTemplatehasKey(key);

}catch (Exception e){

return false;

}

}

/

删除缓存

@param key 可以传一个值或者多个

/

@SuppressWarnings("unchecked")

public void del(String key){

if (key != null && keylength > 0){

if (keylength == 1){

redisTemplatedelete(key[0]);

}else {

redisTemplatedelete((Collection ) CollectionUtilsarrayToList(key));

}

}

}

//=========================String==================================

/

普通缓存获取

@param key 键

@return 值

/

public Object get(String key){

return key == null null : redisTemplateopsForValue()get(key);

}

/

普通缓存放入

@param key 键

@param value 值

@return turn 成功 false 失败

/

public boolean set(String key,Object value){

try {

redisTemplateopsForValue()set(key,value);

return true;

}catch (Exception e){

return false;

}

}

/

普通缓存放入并设置时间

@param key 键

@param value 值

@param time 时间(秒) time要大于0 如果time小于0,将设置成无限制

@return turn 成功 false 失败

/

public boolean set(String key,Object value,long time){

try {

if (time > 0){

redisTemplateopsForValue()set(key,value,time,TimeUnitSECONDS);

}else {

redisTemplateopsForValue()set(key,value);

}

return true;

}catch (Exception e){

return false;

}

}

/

递增

@param key 键

@param delta 值 要增加几(大于0)

@return

/

public long incr(String key,long delta){

if (delta < 0){

throw new RuntimeException("递增因子必须大于0");

}

return redisTemplateopsForValue()increment(key,delta);

}

/

递减

@param key 键

@param delta 值 要减少几(大于0)

@return

/

public long decr(String key,long delta){

if (delta < 0){

throw new RuntimeException("递减因子必须大于0");

}

return redisTemplateopsForValue()decrement(key,delta);

}

// ================================Map=================================

/

HashGet

@param key 键 不能为null

@param item 项 不能为null

@return 值

/

public Object hget(String key, String item) {

return redisTemplateopsForHash()get(key, item);

}

/

获取hashKey对应的所有键值

@param key 键

@return 对应的多个键值

/

public Map hmget(String key) {

return redisTemplateopsForHash()entries(key);

}

/

HashSet

@param key 键

@param map 对应多个键值

@return true 成功 false 失败

/

public boolean hmset(String key, Map map) {

try {

redisTemplateopsForHash()putAll(key, map);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

HashSet 并设置时间

@param key 键

@param map 对应多个键值

@param time 时间(秒)

@return true成功 false失败

/

public boolean hmset(String key, Map map, long time) {

try {

redisTemplateopsForHash()putAll(key, map);

if (time > 0) {

expire(key, time);

}

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

向一张hash表中放入数据,如果不存在将创建

@param key 键

@param item 项

@param value 值

@return true 成功 false失败

/

public boolean hset(String key, String item, Object value) {

try {

redisTemplateopsForHash()put(key, item, value);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

向一张hash表中放入数据,如果不存在将创建

@param key 键

@param item 项

@param value 值

@param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间

@return true 成功 false失败

/

public boolean hset(String key, String item, Object value, long time) {

try {

redisTemplateopsForHash()put(key, item, value);

if (time > 0) {

expire(key, time);

}

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

删除hash表中的值

@param key 键 不能为null

@param item 项 可以使多个 不能为null

/

public void hdel(String key, Object item) {

redisTemplateopsForHash()delete(key, item);

}

/

判断hash表中是否有该项的值

@param key 键 不能为null

@param item 项 不能为null

@return true 存在 false不存在

/

public boolean hHasKey(String key, String item) {

return redisTemplateopsForHash()hasKey(key, item);

}

/

hash递增 如果不存在,就会创建一个 并把新增后的值返回

@param key 键

@param item 项

@param by 要增加几(大于0)

@return

/

public double hincr(String key, String item, double by) {

return redisTemplateopsForHash()increment(key, item, by);

}

/

hash递减

@param key 键

@param item 项

@param by 要减少记(小于0)

@return

/

public double hdecr(String key, String item, double by) {

return redisTemplateopsForHash()increment(key, item, -by);

}

// ============================set=============================

/

根据key获取Set中的所有值

@param key 键

@return

/

public Set sGet(String key) {

try {

return redisTemplateopsForSet()members(key);

} catch (Exception e) {

eprintStackTrace();

return null;

}

}

/

根据value从一个set中查询,是否存在

@param key 键

@param value 值

@return true 存在 false不存在

/

public boolean sHasKey(String key, Object value) {

try {

return redisTemplateopsForSet()isMember(key, value);

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

将数据放入set缓存

@param key 键

@param values 值 可以是多个

@return 成功个数

/

public long sSet(String key, Object values) {

try {

return redisTemplateopsForSet()add(key, values);

} catch (Exception e) {

eprintStackTrace();

return 0;

}

}

/

将set数据放入缓存

@param key 键

@param time 时间(秒)

@param values 值 可以是多个

@return 成功个数

/

public long sSetAndTime(String key, long time, Object values) {

try {

Long count = redisTemplateopsForSet()add(key, values);

if (time > 0)

expire(key, time);

return count;

} catch (Exception e) {

eprintStackTrace();

return 0;

}

}

/

获取set缓存的长度

@param key 键

@return

/

public long sGetSetSize(String key) {

try {

return redisTemplateopsForSet()size(key);

} catch (Exception e) {

eprintStackTrace();

return 0;

}

}

/

移除值为value的

@param key 键

@param values 值 可以是多个

@return 移除的个数

/

public long setRemove(String key, Object values) {

try {

Long count = redisTemplateopsForSet()remove(key, values);

return count;

} catch (Exception e) {

eprintStackTrace();

return 0;

}

}

// ===============================list=================================

/

获取list缓存的内容

@param key 键

@param start 开始

@param end 结束 0 到 -1代表所有值

@return

/

public List lGet(String key, long start, long end) {

try {

return redisTemplateopsForList()range(key, start, end);

} catch (Exception e) {

eprintStackTrace();

return null;

}

}

/

获取list缓存的长度

@param key 键

@return

/

public long lGetListSize(String key) {

try {

return redisTemplateopsForList()size(key);

} catch (Exception e) {

eprintStackTrace();

return 0;

}

}

/

通过索引 获取list中的值

@param key 键

@param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推

@return

/

public Object lGetIndex(String key, long index) {

try {

return redisTemplateopsForList()index(key, index);

} catch (Exception e) {

eprintStackTrace();

return null;

}

}

/

将list放入缓存

@param key 键

@param value 值

@return

/

public boolean lSet(String key, Object value) {

try {

redisTemplateopsForList()rightPush(key, value);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

将list放入缓存

@param key 键

@param value 值

@param time 时间(秒)

@return

/

public boolean lSet(String key, Object value, long time) {

try {

redisTemplateopsForList()rightPush(key, value);

if (time > 0)

expire(key, time);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

将list放入缓存

@param key 键

@param value 值

@return

/

public boolean lSet(String key, List value) {

try {

redisTemplateopsForList()rightPushAll(key, value);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

将list放入缓存

@param key 键

@param value 值

@param time 时间(秒)

@return

/

public boolean lSet(String key, List value, long time) {

try {

redisTemplateopsForList()rightPushAll(key, value);

if (time > 0)

expire(key, time);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

根据索引修改list中的某条数据

@param key 键

@param index 索引

@param value 值

@return

/

public boolean lUpdateIndex(String key, long index, Object value) {

try {

redisTemplateopsForList()set(key, index, value);

return true;

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

移除N个值为value

@param key 键

@param count 移除多少个

@param value 值

@return 移除的个数

/

public long lRemove(String key, long count, Object value) {

try {

Long remove = redisTemplateopsForList()remove(key, count, value);

return remove;

} catch (Exception e) {

eprintStackTrace();

return 0;

}

}

}

重写自定义对象的hashcode()方法,让内容相同的对象返回一样的hashcode默认情况自定义对象是以内存地址为hashcode,你“重新创建一个一样的对象”,存在“重新创建”就会导致对象不一样所以要重写覆盖hashcode方法才能获取到map值

另外,也可以低层一点,你的自定义对象上设一个int id属性 而Map转为以id为键,比如Map<int, Value>。

Bitmap实际上并不是一种数据类型,而是定义在 String 类型上的面向位的 *** 作。因为String是二进制安全的并且最大长度为512MB,所以String可以建立2^32个不同的位。位 *** 作被分为两种:

Bitmap最大的一个优点是当存储信息时可以节省极大的空间。例如一个系统中的用户ID由递增的ID表示,只需使用512MB的内存,就可以记住40亿用户的单比特信息(例如,知道用户是否想收到通讯)。

Bitmap使用 SETBIT 和 GETBIT 命令设置和获取位的值:

SETBIT 命令第一个参数表示需要被设置的位,第二个参数表示需要设置的值(1或者0)。需要注意的是,当被设置的位超过字符串当前的长度时, SETBIT 命令将会自动增加字符串的长度。 GETBIT 返回指定位上的值,对于超过字符串当前长度范围的位,总是被视为0。

Bitmap有三个命令是基于对一组位进行 *** 作的命令:

BITPOS 和 BITCOUNT 都可以对字符串的字节范围进行 *** 作,Bitmap的常见使用场景有:

比如想统计网站最长的用户连续访问天数,可以使用Bitmap,每个位的值作为该天是否访问网站的标志(第一位表示第一天,第二位表示第二天,以此类推),每当用户访问网站时可以使用 SETBIT 设置该天对应的位为1,最后统计连续设置为1的位的数量即可。使用 BITCOUNT 可以统计出用户访问网站的天数,使用 BITPOS 即可统计出最长的连续访问天数。为了分片数据集,最好避免使用大键,可以让每个键存储M个位,将(位数/M)的值与键名关联,将(位数%M)可以获取位数处于键内的位置。

下面是Bitmap相关命令。

Redis Bitmap

原文连接

取map的方法跟普通变量一样,都是根据key来获取。

jstl的迭代取值

当forEach 的items属性中的表达式的值是javautilMap时,则var中命名的变量的类型就是 javautilMapEntry。这时var=entry的话,用表达式${entrykey}取得键名。

用表达式${entryvalue}得到每个entry的值。这是因为javautilMapEntry对象有getKey和getValue方法,表达式语言遵守JavaBean的命名约定:

<c:forEach items="${map}" var="entry">

<c:out value="${entrykey}" />

<c:out value="${entryvalue}" />

</c:forEach>

在java map中取出键值有以下两种方法:

1第一种方法根据键值的名字取值

import javautilHashMap;

import javautilMa

ublic class Test {

public static void main(String[] args)

{   // TODO Auto-generated method stub

Map<String, Object> map=new HashMap<String, Object>();

mapput("id", "sunny");

mapput("value", "syl");         

Systemoutprintln(mapget("id"))

Systemoutprintln(mapget("value"));  }

2第二种方法:遍历

import javautilHashMap;

import javautilMap;

import javautilSet

ublic class Test {

public static void main(String[] args)

{

Map<String, Object> map=new HashMap<String, Object>();

mapput("id", "sunny");

mapput("value", "syl");         

Set<String> get = mapkeySet(); 

for (String test:get)

{        

Systemoutprintln(test+","+mapget(test));

}  }

我们知道Redis默认有16个数据库,默认是第0个数据库,那么如果在需要对数据库进行切换的时候,我们就可以使用下面这个命令:

使用如下命令进行切换

如果想要清除指定某一个数据库的数据

清除所有数据库的数据

接下来这个命令应该是最常用的了

平常在开发中,我们还需要经常对key进行判断,判断其是否存在

因为我们设置的缓存数据一般都不能是永久的,这个时候就需要我们在存储数据的时候,就为其设置过期时间。

string类型是Redis中五大基本数据类型之一,这也是最常使用到的一个数据类型,所有很多小伙伴们对Redis的认识和 *** 作就仅仅的停留在了对Redis的 *** 作层面,但是你是否知道string类型中的相关命令,还是有非常多实用的

接下来先看一下对string类型进行基本存储和获取的命令。

如果我们存储的string中的内容是数字的话,我们也可以对其进行增或减 *** 作,Redis可以自动的对字符串进行相关的 *** 作。实现的命令如下:

使用msetnx时,同时设置一个或多个 key-value 对,当且仅当所有给定 key都不存在时才成立。

getset命令从字面意思就可以看出来,他的作用是先get再set。

总结string类似的使用场景:

在使用list类型进行存取的时候,有两个命令需要进行区分:

注意:只有pop和push才分左右,其他的l都是list的意思

总结:

总结set集合一般用于元素的不重复的场景,比如抽奖系统,轮播等场景下

在使用hash集合的时候,要注意,hash其实就是一个Map集合,key-map的时候,值是一个map集合的形式进行存储的,也和Java中的hashmap有一个类似。

HVALS获取所有的value,HKEYS获取所有的key,HGETALL获取所有的键值

总结:

hash可以用于存储变更的数据,比如user,name,age等,尤其是用户信息之类的,hash更加适合用于对象的存储,string更加适合用于字符串的存储。

在set集合的基础上增加一个序列号,来进行排序

ZRANGEBYSCORE使用语法

总结

以上是在对五种数据类型进行存取时的一些常用命令 *** 作。关于其他的命令使用,小伙伴们在用到的时候可以直接入官网查看就可以了。

BitMap是一串连续的二进制数字(0和1),类似于位数组,每一位所在的位置为偏移量(offset),类似于数组索引,BitMap就是通过最小的单位bit来进行0|1的设置,时间复杂度位O(1),表示某个元素的值或者状态。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间。特别适合一些数据量大的场景。例如,统计每日活跃用户、统计每月打卡数等统计场景。1天记录1000W用户的活跃统计数据,只需要10000000/8/1024/1024 ≈12M。

Redis从220版本开始新增了setbit,getbit,bitcount,bitop等几个BitMap相关命令,虽然是新命令,但是并没有增加新的数据类型,它还是属于String类型。Redis中的BitMap最大占用内存大小限制在512M之内,即2^32。

设置某个key的指定偏移量的value值为0或者1,key不存在时自动生成一个新的字符串值,字符串会进行伸展,该偏移量前面的位值默认为0,偏移量offset参数必须大于等于0,小于2^32。

时间复杂度:O(1)

返回值:指定偏移量存储的值

示例:

获取key指定偏移量上的值,当key不存在时,返回0。

时间复杂度:O(1)

返回值:指定偏移量上存储的值

示例:

统计给定key中,被设置为1的比特位的数量,可以通过start和end参数设置范围。

时间复杂度:O(n)

返回值:key中被设置为1的数量

示例:

对一个或多个key进行位 *** 作,并将结果保存到destkey上。 *** 作方式可以是AND、OR、NOT、XOR这四种,除了NOT *** 作之外,其他 *** 作可接收多个key。

时间复杂度:O(n)

返回值:保存到destkey的字符串的长度

示例:

签到需求:

之前的应用都是统计总数,但如果业务需要,有时也可能需要获取用户ID,来做下一步 *** 作。

以上就是关于RedisUtils工具类全部的内容,包括:RedisUtils工具类、java中的Map的键如果是自己写的一个类的对象,怎么根据这个键获取值、Redis系列第四篇之Bitmap等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9393775.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存