目录
关系数据库
使用标准的SQL语句进行操作,不能被代替,基本数据还是存储在关系型数据库中。
优点:易于理解;
使用方便,通用的SQL语言;
易于维护,丰富的完整性大大降低了数据冗余和数据不一致的概率。
缺点:有IO瓶颈(硬盘I/O 是并发的瓶颈),
海量数据查询效率较低。
非关系型数据库(NoSQL)
Not only SQL 泛指非关系型数据库
以键值对形式存储(key-value),没有固定的关系。
优点:高性能:有非常高的读写性能,得益于它的无关系性,数据库的结构简单;
易于扩展:数据之间无关系;
数据类型灵活: 无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
缺点:只适合存放简单数据;
不适合复杂数据的查询;
不适合持久存放海量数据。
Redis
概述
redis主要用于数据存储;
redis运行在内存中,数据也保存在内存中;
它可以用作数据库、缓存和消息中间件(缓存:让数据离程序更近)。
特点
以键值对形式存储在内存中,也可以存储在硬盘上;
存储结构简单,性能高,易于扩展,支出多语言,保证操作的原子性(因为resdis执行命令是单线程;redis本身提供的所有API都是原子操作,redis中的事务其实是要保证批量操作的原子性);
支持多种数据类型。
数据类型
redis是键值对,键的类型是string;
有五种基本类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(sorted set:有序集合)
底层的数据结构有六种:简单动态字符串、双向链表、压缩列表、哈希表、跳表和整组数组。
全局哈希表
Redis 用一个全局哈希表来保存所有的键值对,这样既能满足应用存取哈希型结构的数据需求,又能提供快速查询功能。
底层是 hash 结构,可以在 O(1)的时间内计算出 hash 值并且找到对应的 entry 位置(通过key计算位置),entry里面是一个一个 key 指针和 value 指针,其实还有其他信息,这也是 redis 之所以性能高的原因之一。
哈希冲突问题:
提供两块内存空间,相当于扩容,将原来的映射渐进式的复制到扩容后的哈希表中,然后释放之前的空间。
String
redis最基本的数据类型,一个key对应一个value;
String类型是二进制安全的(可以包含任何数据,如jpg图片或序列化对象)。
单值缓存:只存储一个值,如手机号/邮箱验证码
set key value ;get key ;del key
对象缓存:建议是值不再改变(不对对象中数据操作时可以使用)
set user1: value(json 格式数据)
计数器: 如文章访问量
set key:1 0 设置文章访问量
incr key:1 值自增1,要求值是数字(文章访问量+1)
decr key:1 值自减1(文章访问量-1 )
get key:1 获得值
Web 集群 session 共享
session + redis 实现 session 共享
Hash
是一个 string 类型的 field(属性) 和 value 的映射表;
适合存储对象数据(适合存储对象属性值需要改变的场景,如电商购物车以用户 id 为 key、商品 id 为 field、商品数量为 value )。
hset key field value 存储一个哈希表 key 的键值
hmset key field1 value1 [field2 value2 …] 存储多个键值对
hget key field 获取哈希表 key 对应的 field 键值
hmget key field1 [field2 …] 批量获取哈希表 key 中多个 field 键值
hdel key field1 [field2 …] 删除哈希表 key 中的 field 键值
hlen key 返回哈希表 key 中的 field 的数量
hgetall key 返回哈希表 key 中所有的键值
hincrby key field 增加的值(减少给负数)
List
是简单的字符串列表,按照插入顺序排序;
实现栈、队列,可以将元素添加到列表的头部(左边)或尾部(右边);
常见用法:Stack= LPUSH + LPOP = FILO ;Queue = LPUSH + RPOP;
使用场景:可以用来存储接收到的消息数据。
lpush key value[value…] 将一个或多个值插入到 key 列表的表头(最左边)
rpush key value[value…] 将一个或多个值插入到 key 列表的表尾(最右边)
lpop key 移除并返回 key 列表的头元素
rpop key 移除并返回 key 列表的尾元素
lrange key start stop 返回列表key中指定区间内的元素,区间以及偏移量start和stop
Set
无序集合
sadd key member[member…] 往集合 key 中存入元素,元素存在则忽略,若 key 不存在则新建
srem key member[member…] 从集合 key 中删除元素
smembers key 获取集合 key 中所有元素
scard key 获取集合 key 的元素个数
ZSet
不允许重复的成员,但是是有序的;
每个元素都会关联一个 double 类型的分数,redis通过分数来为集合中的成员进行从小到大的排序;
zset 的成员是唯一的,但分数可以重复;
使用场景:记录微信朋友圈记录点赞用户。
zadd key score member[[score member]…] 往有序集合 key 中加入带分值元素
zrem key member[member…] 从有序集合 key 中删除元素
zscore key member 返回有序集合 key 中元素 member 的分值
zincrby key increment member 为有序集合 key 中元素 member 的分值加上 increment
zcard key 返回有序集合 key 中元素个数
zrange key start stop[withscores] 正序获取有序集合 keyastart 下标到 stop下标的元素
设置失效时间
EX 表示以秒为单位;PX 表示以毫秒为单位;EX,PX 不区分大小写。
set name jim EX 30 设置失效时间为 30 秒
ttl 键 查看剩余时间(秒)
pttl 键 查看剩余时间(毫秒)
设置值后设置有效时间
expire 键 时间(秒)
pexpire 键 时间(毫秒)