本文为个人在redis的使用上的理解,如有不足请指正
作为NoSQL数据库中较为出众的一种内存缓存方案来解决一些并发问题,还是十分适用的,基于C语言开发,键值对形式的存储,并提供了五种键值数据类型来使用,越是接近底层的东西越是高效,C语言为根本的redis, 相较于关系数据库效率自然不提.
第一点
本身NoSQL,数据库的兴起本身就是传统关系型数据库不能满足日益增长的需求而出现的替代方案,我们使用这些NoSQL的根本目的就是为了解决一些传统数据库无法做到事情,或者帮助传统数据库分担压力。
第二点
效率与安全,在编程领域一直都是一个不可兼得的事情,我们能做的就是在安全的情况下保证效率,或在保证效率的情况下尽量安全,这两种思路是我的方针,对应什么时候使用,要看数据的重要性,越重要的数据安全性的观点就要越排在第一位,话题回归,Redis的数据在内存缓存中,这就注定了他的安全性是没有保障的,但同样也意为着,redis的效率是高效的,他的使用目标从一开始就被我们圈定,就是用于存储一些不重要的热点数据库信息,从而达到缓解数据库压力的目的,同时我们还能配合一些消息中间件,来缓解高并发下的数据库操作.
第三点
也是基于国情的一点,redis免费开源,这是我国很无法舍弃的一点,哈哈,更多还是因为redis的使用并不繁琐,学习成本并不高.
聊完上面的三点 ,我们来从基础来认识下Redis
Redis的五种基础数据类型
(redis的数据都是字符串,命令不区分大小写,key-value中key区分)
(通用查询 keys * 来查询已有的键值对)
字符串类型 String key-value(做缓存)
常用命令 :
set key value 例:set name make
get key 例:get name
incr key (加一,用于生成ID) 例:incr key
Decr key (减一,用于生成ID) 例:Decr key
del key 删除
散列类型 Hash key-fields-values(做缓存)
类似于一个key 对应了一个map map里有key-value
常用命令 :
Hset(向hash中添加内容) 例子:hset d1 b1 1
相当于{d1 [ b1 : 1 ] }
Hget(从hash中取内容) hget d1 b1 结果---> 1
hkeys(通过key获取fields)
hvals (通过key获取values)
hgetall(通过key 获取fields-values)
hdel(通过fields删除 fields-value)
列表类型 List 有顺序可重复
常用命令 :
lpush d2 a b c d (添加)
lrange d2 0 -1 (查询全部) 结果-----> a b c d
lpop d2 (从list中取出第一个值,相当于冒泡) 结果----> a
d2 中只剩 b c d
rpop d2 (取出最后一个值,同上)
集合类型 Set 元素无顺序,不能重复
常用命令 : sadd d3 a b c c c c d (添加) 结果----> a b c d
smembers d3 (查询)
srem d3 a (删除)
有序集合类型 SortedSet(zset) 有顺序,不能重复
常用命令
zadd d4 4 d 3 c 2 b 1 a (添加)结果------> a b c d
zrem d4 0 -1 (查询)
zrevrange d4 0 -1 (查询 从大到小)
*两个查询后 跟上 withscores 可以展示id值 ---》1 a 2 b 3 c 4 d
补充:redis是单线程的,redis也不适合保存内容大的数据
Redis的持久化
两种持久化机制:RDB,AOF 默认才用的RDB
RDB:在定期时间里面发起多少次操作,执行一次持久化操作,适用于测试
AOF:基于日志的持久化机制(Append Only Mode),适用于生产
通过修改redis.conf配置启用AOF机制:appendonly yes(yes表示开启AOF机制)
聊聊这两种方案的优劣
RDB:
1.性能不错,应为fotk出子进程后,可以让子进程来完成持久化的方案,尽可能避免了主线程来执行持久化操作
2.这种方案进行保存的文件的确完整并且恢复起来也是很不错的,但是在执行归档前的记录是并不会被保存的,一旦有突发情况,在归档前数据丢失了,RDB方案是无法恢复的.并且持久化的数据较大时,会引起服务器卡顿.
AOF:
1.无疑保存数据操作指令的方式,安全性无疑更高,别人拿到了日志文件,也无法获取到具体数据库信息,效率因为Redis提供的每秒同步,修改同步,来决定,每秒同步,出现问题会丢失那一秒的数据,修改同步则是一旦有修改就会保存,效率自然也最低.
2.该机制对日志文件的写入操作是 append模式,写入时宏机也不会造成数据丢失,写入一半出错时也在下一次启动redis前通过redis-check-aof工具来解决数据一致性问题,并且数据较大时可以通过rewrite机制,将旧数据迁移,并且不影响新数据的存储
3.效率是会低于RDB的,AOF文件是比同等的RDB文件大,同样如果积累的操作指令随年限过多,同样也会造成启动时间过长问题
【其它】
可以用SSDB来做redis的持久化
Redis可以发布与订阅消息
Redis可以集成tomcat做Session共享