最开始使用的是MySQL,其使用的是磁盘IO方式较慢,无法满足一分钟成千上万次的访问,而使用内存IO的Redis就可以较好的满足。
Redis是NOSQL(Not Only SQL)中的键值存储数据库,性能好较灵活,是在内存中进行存储。
可以通过redis-serve启动服务,通过redis-cli ip地址来连接。
redis没有严格的表结构,而是类似Map的存储方式,一般有16个数据库。
可以使用 select index 来选择不同的数据库,而向redis内部存放数据时,使用的方法也和向map中存放数据类似。set key value 或是mset key value key value .....。
存放数据时不同模块之间可以使用:进行分割,例如要存用户信息中的名字
set user:info:name lbw
存放数据时还可以设定过期时间 set name lbw ex 10(十秒过期),使用ttl key可以查询到相关时间,或者是使用 expire key sec 对以及存在的键设定过期时间
如果要获取数据使用 get key,随机获取键就是 randomkey,删除数据用 del key,如果要查询所有的键,key *,如果要判断某个键是否存在使用 exist key,如果要将数据转移到别的数据库, move key db,还可以对其重命名,rename key newname ,如果使用renamex 就会自动判断是否有重叠。
如果value是纯数字,则可使用自增自减操作incr key,decr key ,如果使用incrby等就可以加上自增的次数
使用 type key 可以查询value的数据类型
通常如果直接存储,形式为字符串,同时还有Hash,就是键值对的值也是一个类似HashMap。通常用来存类相关的数据
Hash
存入时使用命令hset key key value.....,取出使用hget key 内层key。如果要一次性获取所有key值使用hgetall key
删除其中的一个字段,hdel key key ,删除hash:del hkey
hexists 判断某个字段是否存在,hlen 判断字段数目
hval key 一次性获得所有字段的值
但是hash内的值一定是字符串,且不能套娃
List
基本同Java的List
阻塞pop可以同时向多个队列要求数据,谁先有谁弹出
Set和SortedSet
也是和Set相同,不过更像数学上的集合可以进行运算
如果需要集合有序,则需要引入SortedSet,给每个元素附上一个分数,按分数排序,此处添加元素部分应该先写分数后写Key
持久化
由于Redis的所有数据都保存在内存,一旦断电数据丢失,因此将其保存到硬盘也就是持久化非常重要,主要有两种方法一种是直接复制数据保存,另一种是复制保存数据的过程重新对硬盘执行一次。
方法一 RDB
可以开启后台进程进行保存。
方法二 AOF
虽然RDB解决持久化问题,但每次都要完整复制数据库。造成不必要的内存呢开销,也不是实时保存,如果在保存前服务器崩溃依然会导致数据丢失,因此引出AOF,以日志形式记录每次的操作,再根据操作进行恢复,现在默认的方式就是方式2
但是这样依然有问题,大量指令会导致文件过于庞大,导致性能浪费,指令其实可以进行压缩,使用指令bgrwriteaof
或者再配置文件中设置自动重写
Redis也有事务和锁机制保证一段指令完整执行不受其他指令影响
Redis是将命令存储后在输入exec后统一执行
Redis的锁是乐观锁,MySQL与sync都是悲观锁
使用的是 watch key,针对该变量,有一个版本号,如果版本不变继续事务,如果发生改变就取消事务。
和Java进行交互
主要使用的包是jedis
想要调用Redis只需要创建Jedis对象
通过Jedis就可以调用Redis命令
和Spring框架结合,加入依赖只要注入RedisTemplate,所有值相关的操作都需要
RedisTemplate.opsForValue().命令() 字符串操作
opsForHash().命令() Hash操作
以此类推
删除就是直接delete,存在变为hasKey()
Redis此时的事务管理,Java中没有定义,可以借用JDBC的注解,但是内部还是使用Redis的命令
还可以通过Serializer将键值转换为JSON