Redis从基础命令到核心机制简单介绍
关系型数据库 XxxSQL
有表结构要求 二维表-易于维护
非关系型数据库 NoSQL
只要不是关系型数据库 就是非关系型数据库
数据模型比较简单、灵活性较强、数据库性能较高(运行在内存中)、数据一致性较关系型数据库较低、
- 键值存储:Redis
- 列存储:HBase
- 文档型数据库:MongoDb(json数据格式)
- 图形数据库
redis
对于给定的key 可以映射复杂环境
单线程的好处是?内存操作极快,高效利用CPU缓存、规避线程上下文切换的CPU损耗,无需加锁保护共享数据,架构简单易维护
常见命令
redis-cli[-a 密码]登录[+密码]flushdb -- 清空当前库 flushall -- 清空所有数据库clear-- 清屏 keys * -- 查看全部的key keys 前缀* -- 查看指定前缀的key exists key -- 是否存在指定的key expire key 秒数 -- 设置key过期时间 persist key -- 取消key过期时间select0-15 -- 切换到指定数据库 dbsize -- 查看数据库key的数量 multi -- 开启事务(将几个操作挪到一起执行)key的设计
- 唯一性
- 可读性(key简短名义 太长也会影响内存)
- 灵活性
- 时效性(key过期)
数据类型
String
包含字符串类型、数值类型(可以进行加减操作)
命令
setkey 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
命令
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.key2.value3.key...)list
用于用户收藏列表
命令
rpush key value1 value2....-- 设置list key和值 lrange key0-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
无序且唯一
应用场景:抽奖
命令
sadd key value -- 添加数据 smembers key -- 列出指定set的全部value srem key value -- 删除指定集合的一个元素 spop key count -- 随机弹出count个数的元素,并从原集合中删除 srandmember key count -- 随机选出count个数的元素,原集合不改变sdiffkey1 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 -- 判断集合中是否包含valuesorted_set(zset)有序集合
应用场景:热搜 排行榜
命令
zadd key score column-- 存入分数和名称 zincrby key score column-- 给指定key的value分数偏移 例:zincrby key-1javazrange key start end -- 按照分数升序输出column zrevrange key start end -- 按照分数降序输出column zrank keycolumn-- 升序返回指定column的排名 zrevrank keycolumn-- 降序返回指定column 的排名 zcard key -- 返回key的元素个数 zrangebyscore key min max -- 按照分数范围升序输出column zrevrangebyscore key max min -- 按照分数范围降序输出column zrem keycolumn-- 删除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到达过期时间,立即删除(最不友好的方式)
