Redis:
Redis介绍
NoSql基本概念:
非关系型数据库。解决高并发/高可用/高扩展性等一系列问题产生的数据库解决方案。不能完全替代关系型数据库,只能作为关系型数据库的一个良好的补充
NoSql分类:
- 键值对形式(Key-Value)存储数据库
典型应用:内容缓存,主要用于处理大量数据的高访问负载。数据模型:一系列键值对 劣势:存储的数据缺少结构化
- 列存储数据库
典型应用:分布式文件系统 数据模型:以列式存储,将同一列的数据存在一起 对于数据的分析有相当大的优势
- 文档型数据库
典型应用:Web应用 (类似于Json格式)
- 图形(Graph)数据库
典型应用:社交网络
Redis基本概念:
使用C语言开发的一个高性能键值数据库。通过一些键值类型来存储数据。键值类型:String、Hash、List、Set、Zset(有序Set)。
(Q:List和Set的区别是啥? A:List是数组 可重复并且有存入顺序。Set:Set类似一种集合的概念 不可重复并且没有顺序。)
特点:
- 开源的Key-Value存储系统
- 与Membercache相比,支持存储的value类型更多
- 数据都支持push/pop,add/remove 以及其他取交并集和差集等更丰富的操作,这些操作都是原子性的。
- 支持不同方式的排序
- 数据都是存储在内存中,不消耗I/O操作
- 可以支持持久化(RDB和AOF) 支持周期性的把数据写入磁盘或者把修改操作写入追加的记录文件
- 支持集群搭建:主从同步、哨兵模式等
- 单线程+多路IO复用
Redis键(key)命令
keys* 查看当前库的所有key
exists key 查看key是否存在
type key 查看key的类型
del key 删除key
unlink key 根据value选择非阻塞删除
(仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作)
expire key second 给给定的key设置过期时间
ttl key 查看key还有多少秒过期(-2表示已经过期 -1表示永不过期)
select index 切换你的redis库(redis有0-15的库)
dbsize 查看当前redis的key的数量
flushdb 清空当前数据库
flushall 通杀全部数据库 😁 删库跑路
Redis字符串(String)
简介:
String是redis最基本的数据类型,一个key对应一个value
String类型是二进制安全的。意味着Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
一个Redis中字符串value最多可以是512M
常用命令:
set <key><value> 添加键值对
参数:
*NX:当前数据库中key不存在时,可以将key-value添加数据库
*XX:当前数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
*EX:key的超时秒数
*PX:key的超时毫秒数,与EX互斥
get<key> 查询对应键值
append<key><value> 将给定的<value>追加到原值的末尾
setnx <key><value> 只有key不存在时,添加键值对
strlen<key> 获取值的长度
incr<key> 将key中存储的数字值增1
只能对数字值操作,如果为空,新增值为1
decr<key> 将key中存储的数字值减1
同👆
incrby/decrby <key><步长> 将key中存储的数字值增减。自定义步长
原子性:所谓原子操作是指不会被线程调度机制打断的操作。
这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)
(1)在单线程中,能够在单条指令完成的操作都可以称为原子操作 因为中间不会发生线程切换
(2)在多线程中,不能被其他进程(线程)打断的操作就叫做原子操作
Redis单命令的原子性主要得益于Redis的单线程
mset<key1><value1><key2><value2> 同时设置一个或多个key-value键值对
mget<key1><key2><key3>... 同时获取一个或多个value
msetnx<key1><value1><key2><value2>...
同时设置一个或多个key-value,当且仅当所有给定key不存在时
原子性,要么都成功,要么都失败!
getrange<key><起始位置><结束位置> 获取值的范围
setrange <key><起始位置><value>
用<value>覆盖<key>所存储的字符串值,从起始位置开始(索引从0开始)
setex<key><过期时间><value> 设置键值的同时,设置过期时间,单位秒
getset<key><value> 以旧换新,设置了新值同时获得旧值
数据结构:
String的数据结构就是简单动态字符串(Simple Dynamic String SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
Redis列表(List)
简介
单键多值。
Redis列表是简