一.Redis概念
1.关系数据库SQL与非关系数据库NoSQL
关系数据库
- 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。
- SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。
- 主流的关系型数据库包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2、PostgreSQL 等。
- 以上数据库在使用的时候必须先建库建表设计表结构,然后存储数据的时候按表结构去存,如果数据与表结构不匹配就会存储失败。
非关系数据库
- NoSQL(NoSQL = Not Only SQL ),意思是“不仅仅是 SQL”,是非关系型数据库的总称。
- 除了主流的关系型数据库外的数据库,都认为是非关系型。
- 不需要预先建库建表定义数据存储表结构,每条记录可以有不同的数据类型和字段个数(比如微信群聊里的文字、图片、视频、音乐等)。
- 主流的 NoSQL 数据库有 Redis、MongBD、Hbase、Memcached、ElasticSearch、TSDB 等。
2.关系型数据库和非关系型数据库区别
数据存储方式不同
- 关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
- 与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。你的数据及其特性是选择数据存储和提取方式的首要影响因素。
扩展方式不同
- SQL和NoSQL数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
- 要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都需要通过提高计算机性能来克服。虽然SQL数据库有很大扩展空间,但最终肯定会达到纵向扩展的上限。
- 而NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。
对事务性的支持不同
- 关系型数据库遵循ACID规则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))。
- NoSQL数据库遵循BASE原则(基本可用(Basically Availble)、软/柔性事务(Soft-state)、最终一致性(Eventual Consistency))。
- 由于关系型数据库的数据强一致性,所以对事务的支持很好。关系型数据库支持对事务原子性细粒度控制,并且易于回滚事务。
- NoSQL数据库是在CAP(一致性、可用性、分区容忍度)中任选两项,因为基于节点的分布式系统中,不可能同时全部满足,所以对事务的支持不是很好。
总结:
关系型数据库:
实例-->数据库-->表(table)-->记录行(row)、数据字段(column)
非关系型数据库:
实例-->数据库-->集合(collection)-->键值对(key-value)
非关系型数据库不需要手动建数据库和集合(表)。
3.redis概念
Redis(远程字典服务器) 是一个开源的、使用C语言编写的NoSQL数据库。
Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。端口号:TCP/6379
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降;若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时,会给服务器的CPU造成很大压力。即:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程。若CPU资源比较紧张,采用单进程即可。
4.redis优点
具有极高的数据读写速度:数据读取的速度最高可达到 110000 次/s,数据写入速度最高可达到 81000 次/s。
支持丰富的数据类型:支持 key-value、Strings、Lists、Hashes、Sets 及 Ordered Sets 等数据类型操作。
支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
原子性:Redis 所有操作都是原子性的。
支持数据备份:即 master-salve 模式的数据备份。
5.redis使用场景
Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一。除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。
6.redis为什么那么快?
- redis是基于内存运行,数据的读写都是在内存中完成的
- 数据结构简单,可以直接使用 键值对 的方式存储数据
- 数据读写采用单线程模型,避免了多线程切换带来的CPU性能损耗,同时也不用考虑各种锁的影响
- 采用IO多路复用模型,非阻塞IO可以使网络线程处理更多的网络连接请求,提高了网络并发能力
7.数据类型:五大基础数据类型
string(字符串)
list(列表)
hash(哈希/散列)
set(集合/无序集合)
zset/sorted set(有序集合)
Redis 命令工具
redis性能压测攻击
redis-benchmark -h <redis服务器地址> -p <redis端口> -a <redis密码> -c <并发连接数> -n <总请求数> -d <请求的数据大小> -t <测试的命令列表> -q
redis命令行客户端工具
redis-cli -h <redis服务器地址> -p <redis端口> -a <redis密码> [命令]
二.常用命令
1.string类型操作:(计数器)
set 键 值
get 键
setex 键 秒数 值 #创建键并设置过期时间
incr 键 #数字递增+1
decr 键 #数字递减-1
STRLEN 键 #统计键值的字符长度
mset 键1 值1 键2 值2
mget 键1 键2
2.list类型操作:(消息队列)
lpush 键 值1 值2 .... #从左边开始插入元素
rpush 键 值1 值2 .... #从右边开始插入元素
lrange 键 起始位置 终止位置 #起始位置 0表示左边开始的第一个元素,终止位置 -1表示到最后一个元素
lpop 键 #显示并删除左边第一个元素
rpop 键 #显示并删除右边第一个元素
lrem 键 N 值 #从左边开始删除N个指定元素
llen 键 #统计元素的数量
lindex 键 元素位置 #查看第N个元素的值
linsert 键 before|after 元素 值 #在指定元素前|后插入
3.hash类型操作:(存储对象描述)
hset 键 字段 值
hmset 键 字段1 值1 字段2 值2 ....
hget 键 字段
hkeys 键 #查看所有的字段
hvals 键 #查看所有字段的值
hdel 键 字段 #删除指定字段
4.set类型操作:(抽奖,求交集、差集、并集)
sadd 键 值1 值2 .... #元素不能重复
smembers 键 #查看元素,无序的
srem 键 值1 值2 ... #删除指定的元素
srandmember 键 N #随便显示N个元素
scard 键 #统计元素的数量
spop 键 #随机显示并删除一个元素
smove 键1 键2 值 #将键1的元素移动到键2中
sinter 键1 键2 #求键1与键2的交集
sdiff 键1 键2 #求键1与键2的差集
sunion 键1 键2 #求键1与键2的并集
5.zset类型操作:(排行榜,热搜)
zadd 键 权重1 值1 权重2 值2 .... #score权重是可以重复的,元素值是不可以重复的
zrange 键 起始位置 终止位置 [withscores] #起始位置 0表示左边开始的第一个元素,终止位置 -1表示到最后一个元素
zrangebyscore 键 起始权重 终止权重 [limit N M] #查看指定权重范围的元素,按score从小到大,limit N M 表示只显示第N个之后的M个元素(不包括第N个元素)
zrevrange 键 起始位置 终止位置 #降序查看
zrevrangebyscore 键 起始权重 终止权重 [limit N M] #按score从大到小查看
zcard 键 #统计元素的数量
zcount 键 起始权重 终止权重 #统计指定权重范围的元素数量
zrem 键 值1 值2 ... #删除指定的元素
zincrby 键 权重 值 #添加新的元素或增加指定元素的权重
6.通用操作
del 键 #删除键
type 键 #查看键的数据类型
keys 键 #查询键,支持通配符 * ?
exists 键 #判断键是否存在
expire 键 秒数 #为键设置过期时间
ttl 键 #查看键当前的过期时间,-1 永不过期,-2 已过期
rename 键 新键 #重命名键,会覆盖已存在的键
renamenx 键 新键 #重命名键,不会覆盖已存在的键
dbsize #统计当前库中键的总数
config set requirepass '密码' #设置redis密码
config get requirepass #查看redis密码
select 库ID #切换库,默认库ID为 0~15
move 键 库ID #移动键到指定的库
flushdb #清空当前库所有键(慎用)
flushall #清空所有库所有键(慎用)