关系型数据库 XxxSQL
有表结构要求 二维表-易于维护
非关系型数据库 NoSQL
只要不是关系型数据库 就是非关系型数据库
数据模型比较简单、灵活性较强、数据库性能较高(运行在内存中)、数据一致性较关系型数据库较低、
- 键值存储:Redis
- 列存储:HBase
- 文档型数据库:MongoDb(json数据格式)
- 图形数据库
redis
对于给定的key 可以映射复杂环境
单线程的好处是?内存操作极快,高效利用CPU缓存、规避线程上下文切换的CPU损耗,无需加锁保护共享数据,架构简单易维护
常见命令
bash
redis-cli [-a 密码] 登录[+密码]
flushdb -- 清空当前库
flushall -- 清空所有数据库
clear -- 清屏
keys * -- 查看全部的key
keys 前缀* -- 查看指定前缀的key
exists key -- 是否存在指定的key
expire key 秒数 -- 设置key过期时间
persist key -- 取消key过期时间
select 0-15 -- 切换到指定数据库
dbsize -- 查看数据库key的数量
multi -- 开启事务(将几个操作挪到一起执行)
key的设计
- 唯一性
- 可读性(key简短名义 太长也会影响内存)
- 灵活性
- 时效性(key过期)
数据类型
String
包含字符串类型、数值类型(可以进行加减操作)
命令
bash
set key value -- 设置值
get key -- 获取value值
incr key -- 为key对应的value值+1,返回的是加后的值
decr key -- 为key对应的value值-1,返回的是减后的值
del key -- 删除
setex key 秒数 value -- 设置key过期时间
ttl key -- 查看剩余存活时间 -1表示永远存在 -2表示已过期
setnx key value -- 为key设置值 有值无法放置 返回0,没有值可以设置 返回1
incrby key num -- 为指定key 加几(减为加负数)
mset key value key value ..... -- 批量存入key-value
append key 需要添加的字符串 -- 为指定key的value拼接字符串
setrange key 变更的节点值 变更的字符串 -- 为指定key的value在指定位置替换
hash
大key+小key 取value
命令
bash
hset KEY key value -- 设置值
hsetnx KEY key value -- 设置值 存在返回0不改变原值、不存在创建返回1
hget KEY key -- 获取指定value值
hexists KEY key -- 判断指定KEY中是否包含key
hdel KEY key -- 删除key
del KEY -- 删除KEY
hincrby KEY key 需要添加的值 -- 为指定value添加指定的值 (可以添加负数)
hlen KEY -- 判断KEY 中有几个key
hkeys KEY -- 查看KEY对应的所有key 无序的
hvals KEY -- 查看所有value
hgetall KEY -- 查看所有的key value (1.key 2.value 3.key ...)
list
用于用户收藏列表
命令
bash
rpush key value1 value2.... -- 设置list key和值
lrange key 0 -1 -- 查看全部key的value
lpop key -- 弹出list最左侧的数据
rpop key -- 弹出list最左侧的数据
llen key -- 获取列表长度
linsert key before/after 参照值 添加的值 -- 在参照值的前/后添加新值
lset key index value -- 根据索引修改数据
lrem key count value -- 在列表中按照指定个数删除数据
ltrim key 开始节点 结束节点 -- 截取为指定范围数据
lindex key index -- 根据指定索引取列表中的数据
set
无序且唯一
应用场景:抽奖
命令
bash
sadd key value -- 添加数据
smembers key -- 列出指定set的全部value
srem key value -- 删除指定集合的一个元素
spop key count -- 随机弹出count个数的元素,并从原集合中删除
srandmember key count -- 随机选出count个数的元素,原集合不改变
sdiff key1 key2 -- 取key1 相对 key2 的差集
sdiffstore var key1 key2 -- 返回key1 相对 key2 的差集 存储到var中
sinter key1 key2 -- 取两个集合的交集
sinter var key1 key2 -- 取两个集合的交集 存储到var中
sunion key1 key2 -- 返回两个集合的并集
sunion var key1 key2 -- 返回两个集合的并集 存储到var中
smove key1 key2 value -- 把key1 中的value放到key2 中
scard key -- 返回集合中元素个数
sismember key value -- 判断集合中是否包含value
sorted_set(zset)有序集合
应用场景:热搜 排行榜
命令
bash
zadd key score column-- 存入分数和名称
zincrby key score column-- 给指定key的value分数偏移
例:zincrby key -1 java
zrange key start end -- 按照分数升序输出column
zrevrange key start end -- 按照分数降序输出column
zrank key column -- 升序返回指定column的排名
zrevrank key column -- 降序返回指定column 的排名
zcard key -- 返回key的元素个数
zrangebyscore key min max -- 按照分数范围升序输出column
zrevrangebyscore key max min -- 按照分数范围降序输出column
zrem key column -- 删除key中指定的column
zremrangebyscore key max min -- 根据分数范围删除column
zremrangebyrank key start end -- 根据排名删除column
zcount key min max -- 按照分数范围统计个数
持久化机制
RDB(Redis DataBase)
redis 默认的持久化方案
AOF(Append Only File)
appendfsync:
always:同步持久化(慢,安全)
everysec:出厂默认,每秒异步记录一次
no:不同步
内存淘汰机制及过期key处理
内存淘汰机制
- LRU:(Least recently used)长期不用的数据
- LFU:(Least Frequently Used) 一段时间内使用最少
- TTL:数据设置的过期时间,即将过期,内存不足时提前淘汰
- 随机淘汰
过期清除策略
- 惰性删除:访问key时发现过期了再删除,对cpu友好,对内存不友好(可以搭配TTL使用)
- 定期删除:隔一段时间,对数据检查一次,删除过期key
- 定时删除:设置key过期时间的同时创建定时器,key到达过期时间,立即删除(最不友好的方式)