Redis 简介redis是以key-value形式存储和传统的关系型数据库不一样不一定遵循传统数据库的一些基本要求。redis是非关系型的分布式的开源的水平可拓展的优点:对数据高并发读写(直接是内存中进行读写的)对海量数据的高效率存储和访问对数据的可拓展性和高可用性单线程操作,每个操作都是原子操作,没有并发相关问题缺点:无法做太复杂的关系数据库模型关系型数据库和非关系型数据库的区别比较项关系型数据库非关系型数据库数据模型表格结构多个表之间有关联灵活模型文档、键值、图等查询能力SQL标准强一致性多样化查询语法事务支持强事务弱事务或有限支持适用场景数据结构稳定高扩展需求、灵活模式或特殊数据结构数据类型及常用命令String 字符串命令说明setkey value存入或修改键值对getkey根据键取出值incrkey自增decrkey自减delkey根据键删除值setexkey timeout value存入或修改键值对并设置过期时间ttlkey查询 key 的过期时间-1为无过期时间-2为已失效setnxkey value存入键值对如果已存在则不做操作incrbykey num将当前的值增加 numdecrbykey num将当前的值减少 nummsetk1 v1 k2 v2 …批量存入或修改键值对mgetk1 k2 …批量获取键值对appendkey value尾部追加值setrangekey index value在当前字符串的指定位置增加Hash 表命令说明hsetkey hashkey hashvalue设置一个 hash 对象的键值对hgetkey hashkey根据 hash 对象的键获取值hexistskey hashkey判断这个 hash 对象是否有这个键hdelkey hashkey根据 hashkey 删除某个 hash 键值对hincrbykey hashkey递增 hash 的值hlenkey获取 hash 对象 key 的数量hkeyskey获取 hash 对象的所有的键hvalskey获取 hash 对象的所有的值hgetallkey获取 hash 对象的所有数据hsetnxkey hashkey hashvalue存入一个 hash 对象的键值对如果有则不做操作List 列表命令用法rpush/lpushkey value往列表右/左边添加数据lrangekey start end范围显示列表数据,全显示则设置0 -1lpop/rpopkey弹出列表最左/右边的数据llenkey获取列表长度linsertkey before/after refVal value参考值之前/后插入数据lsetkey index value根据索引修改数据lremkey count value在列表中按照个数删除数据ltrimkey start end范围截取列表lindexkey index根据索引获取列表数据Set 无序集合命令用法saddkey value往 set 集合中添加元素smemberskey列出 set 集合中的元素sremkey value删除 set 集合中的元素spopkey count随机弹出集合中的元素sdiffkey1 key2返回 key1 中特有元素(差集)sinterkey1 key2返回两个 set 集合的交集sunionkey1 key2返回两个 set 集合的并集sdiffstore/sinterstore/sunionstorevar k1 k2取交集/并集/差集后将返回值放到另一个 set 里smovekey1 key2 value把 key1 中的某元素移入 key2 中scardkey返回set集合中元素个数sismemberkey value判断集合是否包含某个值srandmemberkey count随机获取 set 集合中元素zSet 集合命令用法zaddkey score value存入分数和名称zincrbykey score column偏移名称对应的分数zrangekey start end按照分数升序输出名称zrevrangekey start end按照分数降序输出名称zrankkey name升序返回排名zrevrankkey name降序返回排名zcardkey返回元素个数zrangebyscorekey min max [withscores]按照分数范围升序输出名称zrevrangebyscorekey max min [withscores]按照分数范围降序输出名称zremkey name删除名称和分数zremrangebyscorekey min max [withscores]根据分数范围删除元素zremrangebyrankkey start end根据排名删除元素zcountkey min max按照分数范围统计个数事务命令用法multi开启事务exec提交事务discard取消事物其他高级命令命令用法keysname查询所有的 key 名可以用 * 模糊查询existskey查询是否存在 keyexpirekey设置某个 key 的过期时间persistkey取消 key 的过期时间flushdb/flushall清空当前库/清空所有库selectnumber选择库0~15movekey index将 key 移动到第 index 个数据库randomkey随机返回数据库中的keyrenamekey newkey重命名dbsize查看数据库的key数量**info **获取数据库信息**config get **实时传储收到的请求(返回相关的配置信息)**config get * **返回所有配置理论部分选择数据类型的原则如果确定使用redis, 此时需要考虑使用哪个数据类型如果要排序选用zset如果数据是多个且允许重复选用list如果数据是多个且不允许重复选用set剩下的使用string如果是对象类型也可使用hash有些公司约定: 所有的redis的key跟value都使用字符串如果使用排序就用zset因为这样可以避免泛型的使用方便转换字符串Key 的设计key的设计唯一性可读性灵活性时效性持久化机制RDB默认方式。将内存中以快照的方式写入到二进制文件中.默认为dump.rdb。可以配置设置自动做快照持久化方式。我们可以配置 redis 在 n 秒内如果超过 m 个 key 就修改自动做快照。执行 save 命令或 flushdb/flushalll 命令时会直接触发 RDBsave 900 1 #900秒内如果超过1个Key被修改则发起快照保存 save 300 10 save 60 10000AOFaof比快照方式有更好的持久化性是由于在使用aof时redis会将每一个收到的写命令都通过write函数追加到命令中当redis重新启动时会重新执行文件中保存的写命令来在内存中重建这个数据库的内容.这个文件在bin目录下appendonly.aofappendonly yes //启动aof持久化方式有三种修改方式 #appendfsync always//收到命令就立即写到磁盘,效率最慢.但是能保证完全的持久化 #appendfsync everysec//每秒写入磁盘一次,在性能和持久化方面做了很好的折中 #appendfsync no //完全以依赖os 性能最好,持久化没保证总结RDB 性能好但是易丢失数据AOF 性能差但是不易丢失数据内存淘汰机制常见的内存淘汰机制分为四大类1. LRULRU是Least recently used最近最少使用的意思简单的理解就是从数据库中删除最近最少访问的数据该算法认为你长期不用的数据那么被再次访问的概率也就很小了淘汰的数据为最长时间没有被使用仅与时间相关。2. LFULFU是Least Frequently Used最不经常使用的意思简单的理解就是淘汰一段时间内使用次数最少的数据这个与频次和时间相关。3. TTLRedis中有的数据是设置了过期时间的而设置了过期时间的这部分数据就是该算法要解决的对象。如果你快过期了不好意思我内存现在不够了反正你也要退休了提前送你一程把你干掉吧。4. 随机淘汰生死有命富贵在天是否被干掉全凭天意了。Key 删除策略Redis中大家会对存入的数据设置过期时间那么这些数据如果过期了Redis是怎么样把他们消灭掉的呢我们一起来探讨一下。下面介绍三种清除策略惰性删除当访问Key时才去判断它是否过期如果过期直接干掉。这种方式对CPU很友好但是一个key如果长期不用一直存在内存里会造成内存浪费。定时删除设置键的过期时间的同时创建一个定时器当到达过期时间点立即执行对Key的删除操作这种方式最不友好。定期删除隔一段时间对数据进行一次检查删除里面的过期Key至于要删除多少过期Key检查多少数据则由算法决定。举个例子方便大家理解Redis每秒随机取100个数据进行过期检查删除检查数据中所有已经过期的Key如果过期的Key占比大于总数的25%也就是超过25个再重复上述检查操作。集成 Java 应用Jedis导入依赖dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactId/dependency基本操作// 创建Jedis连接池JedisPoolpoolnewJedisPool(localhost,6379);// 从连接池中获取Jedis对象Jedisjedispool.getResource();jedis.auth(123456);// 密码// TODO: 执行逻辑System.out.println(jedis);// 关闭资源销毁连接池jedis.close();pool.destroy();细节配置GenericObjectPoolConfigconfignewGenericObjectPoolConfig();//最大连接数, 默认8个config.setMaxTotal(100);//最大空闲连接数, 默认8个config.setMaxIdle(20);//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1config.setMaxWaitMillis(-1);//在获取连接的时候检查有效性, 默认falseconfig.setTestOnBorrow(true);JedisPoolpoolnewJedisPool(config,192.168.122.128,6379,5000,wolfcode);Jedisjpool.getResource();Stringnamej.get(name);System.out.println(name);j.close();pool.close();pool.destroy();之后调用的方法名同以上命令名集成 SpringBoot导入依赖!-- SpringBoot 父类 --parentartifactIdspring-boot-starter-parent/artifactIdgroupIdorg.springframework.boot/groupIdversion2.3.3.RELEASE/version/parent!-- SpringBoot 集成 redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- SpringBoot 测试 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependencyapplication.ymlspring:redis:host:127.0.0.1port:6379password:基本操作AutowiredprivateStringRedisTemplateredisTemplate;TestpublicvoidtestRedisTemplate(){// 操作stringredisTemplate.opsForValue().set(name,LTT);// 操作hashredisTemplate.opsForHash().put(user,name,LTT);// 操作listredisTemplate.opsForList().leftPush(hobby,唱);// 操作setredisTemplate.opsForSet().add(颜色,红,黄,蓝);// 操作zsetredisTemplate.opsForZSet().add(名单,小明,100);}