
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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)