redis的基本数据类型(redis设置开机自启动)
- 开发语言
- 2023-08-13
- 338
Redis缓存是针对于业务数据缓存还是对数据库数据缓存不应该问Redis缓存的是业务数据还是数据库数据,可以问Redis是属于业务层还是数据层,这样问比较合理。我觉得R...
Redis缓存是针对于业务数据缓存还是对数据库数据缓存
不应该问Redis缓存的是业务数据还是数据库数据,可以问Redis是属于业务层还是数据层,这样问比较合理。
我觉得Redis属于数据层;首先我们先看一个概念。
DAOdataaccessobject:数据访问对象
主要用来封装对数据的访问,注意,是对数据的访问,不是对数据库的访问。
其实你的数据可以在数据库,在文件中,还是在Redis中,都可以通过DAO层访问。
所以我把Redis看成和数据库是同一个级别的。
Mybatis的二级缓存我们使用Redis的时候,很多时候都是通过代码操作Redis,比如使用用Jedis,其实还有一个简单的办法,就是使用Redis做Mybatis的二级缓存,只需要做简单的配置和极少量的代码即可。
我们之前做的一个项目,会有大量的数据需要频繁被查询,很少(几乎没有)做新增修改删除的操作,这种数据很适合使用Redis进行缓存,所以新的版本想把Redis引入进来。
引入所需要的jar包:
增加配置文件
实现org.apache.ibatis.cache.Cache接口
mybatis-config.xml开启二级缓存:<settingname="cacheEnabled"value="true"/>
mybatis的Mapper配置文件中增加配置:
<cachetype="com.xxx.xxx.cache.RedisCache"/>
其中useCache="false"表示,这个查询SQL不进行缓存;useCache="true",这个查询SQL的结果进行缓存。
其余的insert、update、delete操作,可以进行如下配置:flushCache="true/false",当设置成true的时候,执行sql会把redis中的缓存删除(调用Cache实现类的clear()方法),设置成false,则不做操作。
所以到这里也可以清楚的理解何时进行缓存、何时进行删除缓存了:程序刚启动的时候,Redis中是空的。每次执行select的时候,首先会去redis读取,读取不到的话,再去db中查询,查询结束后,将结果存入redis中(key里面包含了SQL语句),注意,如果sql查询无结果,也会放入redis中。执行insert、update、delete语句的时候,清除对应的redis中的值。
整理的功能实现还是很简单的,大家有兴趣可以尝试一下。
如果大家需要demo的源码,后续我整理一下发出来,有需要的朋友可以关注下我。
redis可以存储哪些数据类型
redis开创了一种新的数据存储思路,使用redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。 redis常用数据类型 redis最为常用的数据类型主要有以下五种:string、hash、list、set、sortedset
redis七种数据类型
7种类型分别是:
1.字符串(string)
2.哈希(hash)
3.列表(list)
4.集合(set)
5.有序集合(sortedset)
6.位图(Bitmaps)
7.基数统计(HyperLogLogs)
a、字符串
String是一组字节。在Redis数据库中,字符串是二进制安全的。这意味着它们具有已知长度,并且不受任何特殊终止字符的影响。可以在一个字符串中存储最多512兆字节的内容。
b、哈希
哈希是键值对的集合。在Redis中,哈希是字符串字段和字符串值之间的映射。因此,它们适合表示对象。
c、列表
Redis列表定义为字符串列表,按插入顺序排序。可以将元素添加到Redis列表的头部或尾部。
d、集合
集合(set)是Redis数据库中的无序字符串集合。在Redis中,添加,删除和查找的时间复杂度是O(1)。
e、有序集合
Redis有序集合类似于Redis集合,也是一组非重复的字符串集合。但是,排序集的每个成员都与一个分数相关联,该分数用于获取从最小到最高分数的有序排序集。虽然成员是独特的,但可以重复分数。
f、位图RedisBitmap
RedisBitmap通过类似map结构存放0或1(bit位)作为值。
RedisBitmap可以用来统计状态,如日活是否浏览过某个东西。
Redissetbit命令
Redissetbit命令用于设置或者清除一个bit位。
*Redissetbit命令语法格式
SETBITkeyoffsetvalue
g、基数统计HyperLogLogs
RedisHyperLogLog可以接受多个元素作为输入,并给出输入元素的基数估算值
基数
集合中不同元素的数量,比如{'apple','banana','cherry','banana','apple'}的基数就是3
估算值
算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内
HyperLogLog的优点是:即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近264个不同元素的基数。
这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
因为HyperLogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
RedisPFADD命令
RedisPFADD命令将元素添加至HyperLogLog
*RedisPFADD命令语法格式
PFADDkeyelement[element...]
redis有哪些数据类型
redis目前能够在缓存领域迅速蚕食鲸吞memcached的市场占比,能够在分布式架构中扮演重要的地位,都与其支持多种数据类型(而memcached只支持一种)这个优势有关。
redis支持存储的数据类型一共有5种,但是根据我的工作经验,最常用的只有三种,接下来,我就介绍下最常用的三种。
Listlist是redis中常用的数据类型,能够进行头尾查找,插入,移除(lpop,lpush,rpop,rpush等等);
支持像Python一样的分片读取(lrangeapi);
可以按照索引查找队列中元素(lindex),删除队列中元素(lrem),修改队列中元素(lset),还能获取队列长度(llen)。
list还有一个更加突出的功能,它可以从当前队列弹出一个值,然后插入到另一个队列中(BRPOPLPUSH)。这个过程是原子的,保证了数据一致性,避免由于中间步骤失败而导致数值丢失。
Setset其实和list类似,但是正如平时我们了解的set,首先它的存储是无序的,其次它的存储是去重的。也就是说,如果你需要记录数据的插入顺序,或者可能会插入重复数据,并且数据不可去重的话,用list就更合适些,其它场景,就可以考虑用set。
set可以进行基础的增删(sadd,srem),也能进行进行集合操作,比如求差集(sdiff),求交集(sinter),求并集(sunion),返回集合中全部元素,但是并不将它们弹出(smember)。同时set也支持像list一样,用一个原子操作,把一个元素从当前set弹出,并压入另一个set(smove)。
hashhash是redis中最常用的一种数据结构,其实就是我们常说的map。
它是一个string型的key-value,因此特别适用于存储序列化对象。理论上,每个hash可以存储40多亿个键值对。
hash的操作api要比set和list多了不少。
基础的有hset,hget,hdel,hexist(检查元素是否存在),hincrby(这个是为指定的整数字段加指定数值,相当于能够原子性的做到查找和修改,减少了我们自己去实现的麻烦)。
hash还有hgetAll,hgetKeys这种接口,能够批量的把hash中指定字段的全部内容都拉取回来。但是要慎用,我曾亲身经历过,在server高并发情况下,会导致server出现OOM。
除了上面介绍的常用的三种,redis还支持String和sortedset,但是由于不太常用,因此不在此介绍了。
以上是我的浅见,欢迎各位在下方评论区交流点赞。
我是苏苏思量,来自BAT的Java开发工程师,每日分享科技类见闻,欢迎关注我,与我共同进步。
本文链接:http://xinin56.com/kaifa/1390.html