redis使用

  • 时间:
  • 浏览:
  • 来源:互联网

简介

全部开源免费,遵循BSD协议(),是一个高性能(NOSQL)的key-value数据库,是一个开源的使用ANSI C语言编写,支持网络,可基于内存亦可持久化的日志型,key-value数据库    
    不允许空值的key存在,命令不区分大小写,但是key严格区分大小写
    NOSQL:非关系数据库
redis是单线程
    redis瓶颈是根据机器得内存和网络宽带,数据都在内存中,多线程会有CPU上下文切换,此操作效率会降低

安装

由于redis是使用c语言编写的所以要先安装gcc语言环境
code:gcc:yum -y install gss automake autoconf libtool make  
    注意点:运行yum是出现 。/var/run/yum.pid 已被锁定,pid位XXX的另一个程序正在运行,解决办法   code  rm -f /var/run/yum.pid
下载redis http://download.redis.io/releases/redis-4.0.1.tar.gz
    解压 tar -zxvf 安装包
    编译 make 或 make MALLOC=libc
    安装编译后的文件到指定路径  code:make PREFIX=/usr/local/redis install 

配置redis===》redis配置文件

移动redis配置文件,再解压的redis目录中将redis.config文件移动到redis的安装目录中  code:cp redis.conf  /usr/local/redis 
查看配置文件 code:less -mN redis.config 
redis默认不是以守护进程的方式运行,可以通过修改改配置,使用yes启用守护进程  redis.config–>daemonize no–>改为yes
守护启动 code:./redis.server ./redis.config 
当redis以守护进程启动时,redis默认会把pid写入 /var/run/redis**.pid文件,可以通过pidfile指定 code:pidfile  /var/run/redis**.pid 
指定默认端口,作者喜欢的歌手
默认位6379访问IP限制,默认配置的是127.0.0.1代表只能本机访问,需要注释掉bind 127.0.0.1,默认持久化操作,在指定时间内对key进行操作后,会将数据保存在硬盘中
默认密码 requirepass    
    在开启密码后访问命令:redis-cli -h host(IP:本机可不写) -p port(端口默认可不写) -a password(qiu)
    退出客户端 : code:quit 
关闭方式
    杀进程(不存储数据)命令:kill -9 PID
    存储关闭会爆粗数据在硬盘:./bin/redis-cli shutdown 关闭redis服务,通过客户端进行shutdown,如果redis设置了密码,需要在客户端先登录后关闭
性能测试  code:redis-benchmark   -h localhost  -p 6379  -c 100 -n 1000000 
![image.png](https://img-blog.csdnimg.cn/img_convert/ab1a2908cf87aa006563abe7d3aafc60.png#align=left&display=inline&height=177&margin=[object Object]&name=image.png&originHeight=177&originWidth=580&size=97071&status=done&style=none&width=580)
![image.png](https://img-blog.csdnimg.cn/img_convert/2e85147bcad1b89c31d790fcea83e15c.png#align=left&display=inline&height=870&margin=[object Object]&name=image.png&originHeight=870&originWidth=1052&size=347431&status=done&style=none&width=1052)

redis key命名 规范

单个 key存入512m大小
    1、key不要太长尽量不超过1024字节,这不仅消耗内存,而且会降低查询效率
    2、key也不要太短。太短可读性会降低
    3、在一个项目中,key最好使用统一的命名模式 示例: blogs:user:name   blogs:user:password

redis命令

基础命令

select index 切换数据库<br />    dbsize  查当前数据库大小<br />    flushdb 清空数据库<br />    flushdb 清空全部数据库<br />    del key 删除key 以数组形式存在 示例:del key1 key 2,返回操作记录数<br />    dump key 序列化key 示例:dump key1<br />    exists key 查询key是否存在  exists key1  返回记录数<br />    expire key 为key指定过期时间 以秒为单位 expire key1 10(秒)<br />    pexpire key 指定存活时间 以毫秒为单位<br />    ttl key 查key存活时间 -1永久 -2没了  pttl 返回存活时间,毫秒单位<br />    persist key 移除key的过期时间,key永久保存<br />    keys patterm 查找符合给定模式的key,获取与pattern匹配的key,返回所有与该匹配的通配符  *代表所有 ?代表一个字符<br />    random key 从当前数据库中随机返回一个key<br />    rename key newkey 重命名key rename key1 key11<br />    move key db 将当前数据库的key移动到给定的数据库 db中  示例:move c 1<br />    type  key  返回key所存储的值的类型

redis 类型

redis数据类型
    字符串string,hash哈希,list列表,set集合,zset(sorted set:有序集合)
    String
        string时redis最基本的数据类型,一个kye对应一个value,且是二进制安全的,意思时redis的string可以包含任何数据,比如jpg图片或者序列化的对象,单个key最大存储512M
        二进制安全是指在传输数据的时候保证二进制的信息安全,也就是不被篡改,破译等,如果被攻击能够及时检测出来
        特点:1、编码,解码发生在客户端,执行效率高。2、不需要频繁的编码解码,不会出现乱码
![image.png](https://img-blog.csdnimg.cn/img_convert/eeac7fbfa238e6921c756768d9de875e.png#align=left&display=inline&height=383&margin=[object Object]&name=image.png&originHeight=383&originWidth=686&size=99098&status=done&style=none&width=686)

string类型

set key_name value ===》redis  set命令设定key的值,如果key已经存在值,就会覆写旧值且无视类型
setex  设置过期时间 setex key 过期时间 值,值存在
setnx key value  在key不存在时设置key的值,setnx(set if not exists),指定key不存在时,为key设置指定值【解决分布式锁】
mset key value [key value]  同时设置一个或多个key-value对
msetnx key1 val1 key2 val2  同时设置多个值,存在则不会成功,
get key 获取指定key的值,如果不采纳在返回nil.如果不是字符串类型,返回错误
getrance key start  end   对于获取在指定key中字符串的子字符串,字符串的截取范围由start 和end两个偏移量决定,且包含start和end
getbit key offset  对key所存储的字符串值,获取指定偏移量上的位(bit)
mget key[key1 key2]获取一个或多个指定key的值
getset 语法:getset key value 设定指定key的值,并返回key的旧值,当key不存在时返回nil ![image.png](https://img-blog.csdnimg.cn/img_convert/0fbf0330a0e771a9ddfdfbbd0f78972e.png#align=left&display=inline&height=85&margin=[object Object]&name=image.png&originHeight=85&originWidth=347&size=5379&status=done&style=none&width=347)
strlen key 返回key所存储的字符串的长度
getrange  key 0  1 截取字符串
setrange 替换指定位置开始的字符串 setrange key  开始的偏移量  值

  • 自增/自减

incry key  将key中存储的数字值增1,如果key不存在,那么key的值会先被初始化位0然后在执行incry操作
自增: incr ++的处理方式 incrby += 步长的处理方式 key  将key中存储的数字加上指定的增量值
自减:decr key 或decrby key 将key中存储的数字减1
字符串拼接:append key value 用于为指定的key追加至末尾,如果不存在,为其赋值
应用场景:保存单个字符串或json字符串,计数器,因为redis线程安全,不存在同时操作,不论同时几个操作指令,都会排队进行
订阅,发布频道
     订阅:subscribe channel  频道名[频道1 频道2]        订阅给定的一个或多个频道
              psubscribe pattern 订阅一个或多个符合给点模式的频道
    发布频道:
              publish channel message 将信息发送到指定频道
    退订:
              unsubscribe channel1 channel2 退订指定一个或多个频道
              punsubscribe pattern1 pattern2 退订一个或多个给定模式的频道

hash类型

map  key-value 格式存储数据 适用于对象存储

  • 赋值语法

hset key field vaule  为指定的key设置属性和值
hmset key field value 【field1,value1】 同时将多个field-value(属性,值) 对设置到哈希表的key中        
示例:hmset users uname xf age 20 address “西安”

  • 取值语法

hget key field 获取存储在hash中的值。根据field得到value
hgetall key  获取hash表中的所有字段和值 hgetall user
hmget key field【多个时 field1,field2】
hkyes key 获取所有哈希表中的字段
hlen key 获取哈希表中的字段数量
hvals key 获取key中所有得值

  • 删除语法 使用公共命令del直接删除key

hdel key field,field2 删除一个或者多个hash表字段
hsetnx key field value 只有在field不存在时设置哈希表字段的值
hincrby key field increment 为哈希表key中指定字段的整数值加上增量 increment 示例:hincrby user age 1(给user中的age加1)
hdecrby 减值
hsetnx key field value 不存在则添加,存在则不加,返回0
hincrbyfloat key field increment 为哈希表key中指定的浮点数值加上增量increment
hexists key field 查看哈希表中指定key是否存在

list类型:linkd list

  • 赋值语法

lpush key value[value1,value2] 将一个或多个值插入到列表头部,从左侧添加 
rpush kay value[value1,value2 在列表中添加一个或多个值,从右侧添加
lpushx key value  将一个值插入到已存在得列表头部,如果列表不存在,操作无效
rpushx     将一个插入已存在得列表尾部,最右边,如果列表不存在,操作无效

  • 取值语法

llen key 获取列表长度
lindex key index  通过索引获取列表中的元素
lrange key start stop   获取列表指定范围内得元素(返回列表中指定区间得元素,区间以偏移量start 和end指定,其中0表示列得第一个元素,1表示列的第二个元素,以此类推,也可以使用附属下标,以-1表示列表得最后一个元素,-2表示倒数一耳光,以此类推)
分页:(pageNum-1)*psgeSize起始条  , pageSize *pageNum -1终止条

  • 删除

lpop key 移出并获取列表得第一个元素(从左侧删除)
rpop key 移出并获取列表得第一个元素(从右侧删除)
blpop key[key1] timeout 移除并获取列表得第一个元素,如果列表没有元素会阻塞列表知道等待超时或发现可弹出元素为止,从左侧
blpop list1 100  此操作会被阻塞,如果指定列表key list1 存在数据则会返回第一个元素,否则等待100秒后返回nil
brpop key[key1] timeout 类似blpop,次语法从右侧取出
ltrim key start stop 对一个列表进行修剪(trim),让列表只保留指定区间内得元素,不在指定区间内得将被移除
lrem 移除数据, lrem key  个数 值,lrem key 个数 值

  • 修改

lset key index value 通过索引设置列表元素得值
linsert key beffore|after world value 正列表得元素前后插入元素(将值value插入到列表key当中,位于值world之后)

  • 高级

rpoplpush source destination 移除列表得最后一个元素,并将改元素添加到另一个列表并返回
示例:rpoplpush a1  a2    a1得最后一个元素移到a2得左侧
rpoplpush a1  a1  循环列表,将最后一个元素移动到最左侧 
brpoplpush source destination timout 从列表弹出一个值,将弹出得元素插入到另一个列表中并返回它,如果列表没有元素会阻塞列表直等到超时或发现可弹出元素为止 
rpoplpush source destination 移除列表得最后一个元素,并将改元素添加到另一个列表并返回

set类型 无序集合

  • 赋值

sadd key value1 value2  向集合中添加一个或多个成员

  • 取值

scard key   获取集合得成员数
smembers key 返回集合中所有成员
sismember key value 判断与元素是否是key中得(验证是否存在)
srandmember key[count] 返回集合中一个或多个随机数

  • 删除

srem key vaule1 value2 移除集合中一个或多个成员
spop key [count] 移除并返回集合中得一个随机数
smove 集合a 集合b 移动得值   将 某个元素从 集合a移动到 集合b

  • 差集语法

sdiff key key1 返回给定所有集合得差集(左侧)     示例:看谁得把谁放在前面
sdiffstore  集合1 key1 key2 返回给定所有集合得差集并存在集合1中

  • 交集语法

sinter key1 key2 返回给定所有几个得交集(共有数据)示例:看谁得把谁放在前面
sinterstorn 集合1 key1 key2 返回给定所有集合得交集并存储在集合1中

  • 并集语法

sunion key1 key2 返回所有给定集合得并集   不区分位置
sunionstore 集合1 key1 key2 返回给定集合得并集并存储在集合1 中

zset类型 有序集合

zadd key(浮点数,类似于序号) value1 key1 value2 key2 向有序集合中添加一个或多个成员,或者更新已存在得成员分数,先值后key

  • 取值

zcard key 获取有序集合得成员数
zcount key min max 计算在有序集合中指定区间分数得成员数
zrank key member 返回有序集合中指定成员得索引
zrange key start stop [withscores] 通过索引区间返回有序集合中指定得成员,低到高
zrevrange key start stop  [withscores] 返回有序集合指定区间内得成员,通过索引,分数高到底

  • 删除

del key 公用方法移除
zrem key member member1 移除有序集合中得一个或多个成员
zremrangebyrank key start stop 移除有序集合中给定得排名区间得所以成员,从下标开始
zremrangebyscore key member 移除有序集合中给定得分数区间得所有成员

  • 排序

zrangebyscore key -inf + inf 正序排列  可带上值–withscores
zrangebyscore key -inf value withscores:  zrangebyscore zset1 -inf 2500 withscores取2500以下得值
zrevrange key 0 -1:从大到小排序 zrevrange zset1 0 -1

三种特殊数据类型

geospatial  地理位置

定位,附近的人,可以使用zrange 等操作查看元素和移除等
redis===》geo
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。    
GEO官方文档:    https://www.redis.net.cn/order/3685.html
geoadd :geoadd  key 维度 精度  名称 :GEOADD dlwz 121.47 31.23 sahnghai  121.47 31.23 beijing添加地理位置,
规则:两极是无法添加的,一般使用程序来到导入
geopos:    geopos key 名称:geopos  dlwz  beijing 获取指定城市的经度和维度
geodist:geodist key 城市 城市1 km 示例:geodist  dlwz  beijing sahnghai KM
如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:m 表示单位为米。** km** 表示单位为千米。mi 表示单位为英里。ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
GEORADIUS key 经度  维度  距离 KM:GEORADIUS  dlwz  110 30 1000 km
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
范围可以使用以下其中一个单位:m 表示单位为米。km 表示单位为千米。mi 表示单位为英里。ft 表示单位为英尺。
GEORADIUSBYMEMBER: 都可以找出位于指定范围内的元素 GEORADIUSBYMEMBER key  城市 距离  示例:GEORADIUSBYMEMBER Sicily Agrigento 100 km

HYPERLOGLOG :做基数统计的算法

基数:不重复的元素,可以有误差
优点:占用内存小(固定),2^64不同元素的数据,只需要12kb,
应用场景:网页UV(访问数量,一个人会访问多次,但也算是一个人)
传统:set保存用户ID,然后统计set中的元素数量来计算,

  • 命令:

pfadd key value:添加数据示例 pfadd key1 a b c d e
pfcount key: 查看key中有多少个 示例 pfcount key1
pfmerge key3 key1 key2:合并量数据,去重

  • BITMAP:位存储

统计差别: 示例(正常0 不正常1,只有两种状态可以使用这个来统计) 
setbit:setbit key 事情 状态 示例:setbit sign 0 1
getbit:getbit key事情 示例:getbit sign 0
bitcount:bitcount key 示例:bitcount sign

redis多数据库

redis下数据库是由一个整数索引标识,为不是由一个数据库名称,默认情况下,一个客户端连接到数据库0,在redis.config文件中 database 16 来控制数据库总数。从0开始
select 数据库: 切换数据库 select 1(第二个数据库,下标)
move  key 数据库:  移动数据库
清空数据库:
flushdb :清楚当前数据库所有的key
flushall:情况整个redis的数据库所有key


缓存预热


redis事务

![image.png](https://img-blog.csdnimg.cn/img_convert/490a31217c1f89bcc1b76f0830ed5b9b.png#align=left&display=inline&height=278&margin=[object Object]&name=image.png&originHeight=278&originWidth=519&size=72697&status=done&style=none&width=519)
redis事务可以一次性执行多个命令(允许在一次单独得步骤中执行一组命令),按顺序得串行执行,执行不会被其他命令加塞
redis单条命令保证原子性的,但是事务不保证原子性,并没有隔离级别的概念
执行特点:批量操作在发出exec命令之前被放入队列缓存,【将一个事务命令序列化,然后按顺序执行】
收到exec命令后进入事务执行,事务中任意命令执行失败,其余得命令依然被执行,在事务执行过程中,其他客户端提交得命令不会插入到事务执行命令序列中

  • 阶段

开始事务(multi)—》命令入队—》执行事务(exec)------》 扩展:放弃事务 discard
事务编译错误(命令错误):事务中所有的命令都不会被执行
![image.png](https://img-blog.csdnimg.cn/img_convert/b5eb5b3c9bd87a5a56ab0282f6fba1fd.png#align=left&display=inline&height=330&margin=[object Object]&name=image.png&originHeight=330&originWidth=673&size=25683&status=done&style=none&width=673)
事务运行异常:事务中存在语法错误,那么执行命令的时候,其他命令时可以正常执行,错误命令会抛出异常
![image.png](https://img-blog.csdnimg.cn/img_convert/a0661a92fc4208c7a4f02d01c34161f8.png#align=left&display=inline&height=258&margin=[object Object]&name=image.png&originHeight=258&originWidth=509&size=68584&status=done&style=none&width=509)
watch 监视key变化(相当于乐观锁,执行过程位先取要操作的key,看值有没有被操作变化,变化则失败),用来监视一个或多个key,如果事务在执行前这个key或者这些key被其他命令所改变,那么事务被打断
示例:监控某个KEY,正常执行
![image.png](https://img-blog.csdnimg.cn/img_convert/897f966ebc4fd9426886c890c3e3c397.png#align=left&display=inline&height=293&margin=[object Object]&name=image.png&originHeight=293&originWidth=733&size=89039&status=done&style=none&width=733)
错误执行(多线程操作同一个key,监视结果失败,失败需要先解锁,然后在加锁执行):一个线程对指定key在操作时,另一个线程也对这个key进行了操作,那么当前现场会失败
![image.png](https://img-blog.csdnimg.cn/img_convert/b392415dba5a187f0e6d2884d24c533b.png#align=left&display=inline&height=230&margin=[object Object]&name=image.png&originHeight=230&originWidth=707&size=74954&status=done&style=none&width=707)
![image.png](https://img-blog.csdnimg.cn/img_convert/5df76be33ef93bb6193a00c55f03a15f.png#align=left&display=inline&height=349&margin=[object Object]&name=image.png&originHeight=349&originWidth=771&size=172912&status=done&style=none&width=771)

redis 缓存与数据库一致性

  • 1、实时同步

一致性要求高需要实时同步,及查询缓存查询不到再从DB查并存到缓存,更新缓存时先更新数据库,在将缓存设置过期(建议部取更新缓存内容,直接设置缓存过期,修改缓存数据或key删除,查询会直接查询数据库)
@Cacheable :查询时使用,注意long类型需要转换为String类型,否则会异常
@CachePut :更新时使用,使用此注解一定会从DB上查询数据
@CacheEvict :删除使用
@Caching : 组合用法

  • 2、异步队列

对于高并发可采用一部队列方式同步,可采用kafka等消息中间件处理消息生成和消费
![image.png](https://img-blog.csdnimg.cn/img_convert/e9684ac8d9766211b4c2e7f358ecc0f6.png#align=left&display=inline&height=439&margin=[object Object]&name=image.png&originHeight=439&originWidth=483&size=190242&status=done&style=none&width=483)

  • 3、阿里工具 canal

模拟mysql slave 和master 得同步机制,监控DB bitlog得日志更新来触发缓存得更新,此方法可以解放程序员双手,尽量减少工作量,但在使用时有些局限性
![image.png](https://img-blog.csdnimg.cn/img_convert/8e6b45dee2360119fcfdafade869afc1.png#align=left&display=inline&height=104&margin=[object Object]&name=image.png&originHeight=104&originWidth=552&size=56018&status=done&style=none&width=552)
![image.png](https://img-blog.csdnimg.cn/img_convert/7bbbcd682113e2fa2534b62e1d925395.png#align=left&display=inline&height=408&margin=[object Object]&name=image.png&originHeight=408&originWidth=610&size=141701&status=done&style=none&width=610)
![image.png](https://img-blog.csdnimg.cn/img_convert/13467c3d83a6b199d8633179db9375e9.png#align=left&display=inline&height=446&margin=[object Object]&name=image.png&originHeight=446&originWidth=688&size=193702&status=done&style=none&width=688)

  • 4、UDF自定义函数方式

面对mysql得API进行编程,利用触发器进行缓存同步。但UDF注意时c/c++实现,成本

redis淘汰策略


##     redis集群 ![image.png](https://img-blog.csdnimg.cn/img_convert/0ea8c5325302294a3878aff6ec2a118a.png#align=left&display=inline&height=253&margin=[object Object]&name=image.png&originHeight=253&originWidth=661&size=182792&status=done&style=none&width=661)
![image.png](https://img-blog.csdnimg.cn/img_convert/7f3c5921d9d85c5e3936678e0b61699b.png#align=left&display=inline&height=85&margin=[object Object]&name=image.png&originHeight=85&originWidth=575&size=40334&status=done&style=none&width=575)
![image.png](https://img-blog.csdnimg.cn/img_convert/1aff01947d88793c5c2b2ac4340f74d9.png#align=left&display=inline&height=541&margin=[object Object]&name=image.png&originHeight=541&originWidth=795&size=308376&status=done&style=none&width=795)
![image.png](https://img-blog.csdnimg.cn/img_convert/22de05565d0ec0b32fd82fecb7881ba2.png#align=left&display=inline&height=270&margin=[object Object]&name=image.png&originHeight=270&originWidth=666&size=203307&status=done&style=none&width=666)
6、检查启动 ps -aef | grep -i redis
![image.png](https://img-blog.csdnimg.cn/img_convert/c58cde1e6fff96f99ab14a4c5b8b194b.png#align=left&display=inline&height=422&margin=[object Object]&name=image.png&originHeight=422&originWidth=714&size=273808&status=done&style=none&width=714)
![image.png](https://img-blog.csdnimg.cn/img_convert/a46010efb7b278f97f9391bade6f9241.png#align=left&display=inline&height=323&margin=[object Object]&name=image.png&originHeight=323&originWidth=662&size=201723&status=done&style=none&width=662)
![image.png](https://img-blog.csdnimg.cn/img_convert/aee4921d246518299d1b068c02f81c0a.png#align=left&display=inline&height=351&margin=[object Object]&name=image.png&originHeight=351&originWidth=616&size=213036&status=done&style=none&width=616)
![image.png](https://img-blog.csdnimg.cn/img_convert/05f41ed7f1147eae5bac3f532928cb57.png#align=left&display=inline&height=323&margin=[object Object]&name=image.png&originHeight=323&originWidth=382&size=123906&status=done&style=none&width=382)
![image.png](https://img-blog.csdnimg.cn/img_convert/c3f98bbcac6524c193c7029fd8e1c71b.png#align=left&display=inline&height=442&margin=[object Object]&name=image.png&originHeight=442&originWidth=693&size=301627&status=done&style=none&width=693)
![image.png](https://img-blog.csdnimg.cn/img_convert/ed5ebdffa5fb14d88524e4596c47f52f.png#align=left&display=inline&height=176&margin=[object Object]&name=image.png&originHeight=176&originWidth=604&size=106618&status=done&style=none&width=604)
![image.png](https://img-blog.csdnimg.cn/img_convert/c1e7a0336e20c746a76c130f8f7d0740.png#align=left&display=inline&height=299&margin=[object Object]&name=image.png&originHeight=299&originWidth=671&size=264510&status=done&style=none&width=671)
![image.png](https://img-blog.csdnimg.cn/img_convert/f4d9ca881da8d33737abc2cb62949a34.png#align=left&display=inline&height=424&margin=[object Object]&name=image.png&originHeight=424&originWidth=680&size=340217&status=done&style=none&width=680)
![image.png](https://img-blog.csdnimg.cn/img_convert/c0528a3b5515279ce4e89a5450156944.png#align=left&display=inline&height=497&margin=[object Object]&name=image.png&originHeight=497&originWidth=762&size=455045&status=done&style=none&width=762)
![image.png](https://img-blog.csdnimg.cn/img_convert/5390c9e8783bc9653c579a524a0a03cd.png#align=left&display=inline&height=352&margin=[object Object]&name=image.png&originHeight=352&originWidth=763&size=241972&status=done&style=none&width=763)
![image.png](https://img-blog.csdnimg.cn/img_convert/b7c8d54ada07476f127fd4e425e754a6.png#align=left&display=inline&height=74&margin=[object Object]&name=image.png&originHeight=74&originWidth=484&size=16825&status=done&style=none&width=484)
![image.png](https://img-blog.csdnimg.cn/img_convert/2c82a1d93bd49c750338fc6edb581cb8.png#align=left&display=inline&height=233&margin=[object Object]&name=image.png&originHeight=233&originWidth=647&size=132925&status=done&style=none&width=647)
![image.png](https://img-blog.csdnimg.cn/img_convert/de9a21f67cb996248f6a7be0246bedc0.png#align=left&display=inline&height=291&margin=[object Object]&name=image.png&originHeight=291&originWidth=617&size=218408&status=done&style=none&width=617) ## redis数据淘汰策略

![image.png](https://img-blog.csdnimg.cn/img_convert/794c8c35415a74a367efe7b2230adc04.png#align=left&display=inline&height=242&margin=[object Object]&name=image.png&originHeight=242&originWidth=550&size=123088&status=done&style=none&width=550)


java连接redis

官方支持 jedis/redisson/jredis/jdbc-redis。其中推荐使用jedis和redisson,常用jedis
jedis–》官方推荐的Java连接开发工具,使用Java操作redis中间件,采用的是直连,多个线程操作的话,是不安全的,如果想避免不安全的,使用jedis pool连接池 BIO
说明:在srpingboot2.X之后,原来使用的jedis被替换为了 lettuce(采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据了,更像NIO模式)
        
对象操作:所有的对象需要序列化

  • 使用:redisTemplate

![image.png](https://img-blog.csdnimg.cn/img_convert/d79a6a1805495759130c03a1f4b9205a.png#align=left&display=inline&height=338&margin=[object Object]&name=image.png&originHeight=338&originWidth=495&size=135601&status=done&style=none&width=495)
![image.png](https://img-blog.csdnimg.cn/img_convert/0dbdd90978cbc8f0cbd6f6f54571f148.png#align=left&display=inline&height=73&margin=[object Object]&name=image.png&originHeight=73&originWidth=512&size=17428&status=done&style=none&width=512)
![image.png](https://img-blog.csdnimg.cn/img_convert/c5d8e939fc040eb905cb6aa86c9fe29a.png#align=left&display=inline&height=211&margin=[object Object]&name=image.png&originHeight=211&originWidth=764&size=153493&status=done&style=none&width=764)
Spring data 提供了redisTemplate模板,他封装了redis连接池管理的逻辑,业务代码无须关心获取,释放连接逻辑,
spring redis同时支持了Jedis,Jredis,rjc客户端操作,在redisTemplate中提供了几个常用的接口方法的使用
ValueOperations<k,v> valueOps;   
ListOperations<k,v>  listOpes;   
SetOperations<k,v> setOps; 
ZSetOperations<k,v> zSetOps;

注意点:
# 创建存放redis日志的文件_touch redis-log.log
# 给所有人可读可写的权限_chmod 777 redis-log.log
1、修改 redis.conf 文件中的 logfil—》vim redis.conf 值为/usr/local/redis/redis-log.log
不要赋值和设置失效期同时进行,会导致设置失效期不起作用



编号生成器:String aa=String.format("%1$06d", 1);获取redis生成得序列在拼接

本文链接http://smartadmin.com.cn/smartadmin/show-6869.html