什么是Redis数据库?
Redis数据库是NoSQL数据库的一种,类似于高德地图这种软件中的对于一些地区等常用信息,我们不免要重复访问,如果每次访问的时候都要去调取mysql数据库,难免会影响使用性能,如果你认为Redis是一个key value store(键值存储), 那可能会用它来代替MySQL;如果认为它是一个可以持久化的cache(缓存), 可能只是它保存一些频繁访问的临时数据。
为什么Redis访问数据要比Mysql快?
1.因为Redis是基于内存存储的,而mysql是基于磁盘存储的
2.Redis是单线程的多路复用IO
3.Redis存储的是k-v格式的数据。时间复杂度是O(1),常数阶,而MySQL引擎的底层实现是B+Tree,时间复杂度是O(logn),对数阶。Redis会比MySQL快一点点。
Redis(key键操作)
查看当前库所有key
判断某个key是否存在
查看key是什么类型
删除key数据
del和unlink的区别 del:直接将数据删除 unlink:根据value选择非阻塞删除,仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作
为给定的key设置过期时间
查看还有多少秒过期(-1表示永不过期,-2表示已过期)
切换数据库
查看当前数据库的key的数量
flushdb清空当前库
flushall通杀全部库
原子性?
原子性:所谓原子操作是指不会被线程调度机制打断的操作
这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)
(1)在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生于指令之间
(2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作
Redis单命令的原子性主要得益于Redis的单线程
Redis String类型的数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList ,采用预分配冗余空间的方式来减少内存的频繁分配.
如图中所示,内部为当前字符串实际分配的空间capacity-般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M ,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
Redis List列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元索到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
Redis List列表的数据结构
List的数据结构为快速链表quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist ,也即是压缩列表它将所有的元素紧挨着一起存储 ,分配的是一块连续的内存
当数据量比较多的时候才会改成qucklist
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结起来组成了quicklist, 也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。