Redis超详讲解
一、非关系型数据库
1.常用的关系型数据库
是一种结构化的数据库,主要建立库表结构,建立在关系型模型上,一般面向与记录。
mysql sqlserver oracle db2
2.非关系型数据库 NOT ONLY SQL
面向对象应用的数据库,针对某个行业或者某种类型的数据存储。在应用中解决大数据的读写问题。
High performance——对数据库高并发读写需求
百度的搜索信息记录 个人身份信息,
Huge Storage——对海量数据高效存储与访问需求
抖音视频,微博类,评价类,购物网站
High Scalability && High Availability——对数据库高可扩展性与高可用性需求
对特殊行业的需求,进行数据库结构的更改或扩展功能。
3.非关系型数据库的分类
Column-Oriented: 面向检索的列式存储,主要用于提供高速的分类查询。对同类数据,或指定时间范围的数据进行分类索引。银行的账单,评价类,微博微信等信息类。
Key-Value 面向高性能并发读写的缓存存储,提供高速读写,也可以作为关系型数据库的缓存服务器使用。
Document-Oriented 面向海量数据访问的文档存储,能够快速,有效的存储文件类数据,视频类,图片类,云空间类。
4.常用的非关系型数据库
Hbase :是面向检索的列式存储。
redis :是一个key-value存储系统,提供高并发的数据读写,与数据缓存。
mongodbd :用于分布式存储文件的数据库。
Neo4j:是一种特殊的图形化数据库,用于建立数据关系,社交网络。
二、Redis数据介绍
Redis是完全开源免费的,遵循BSD协议,是一个高性能的key-value数据库。
【1】redis特点
1)支持丰富的数据类型
2)支持数据的持久化 内存中的数据→硬盘
3)支持数据备份 master-slave
【2】redis优势
1)性能极高 - 具有极高的数据读写速度 读110000次/s 写81000次/s
2)原子性
整个事务所有的步骤是不可分割的,原子性的原则规定一个事务的各个步骤都必须完成,否则整个事务都不会完成。
3)丰富的特性 - redis还支持publish/subscribe,通知,key过期等等特性。
【3】redis与其他key-value存储的不同
1、Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程训员透明,无需进行额外的抽象
2、Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于内存。
在内存数据库方面的另一个优点是:相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面它们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
三、Redis的安装与配置
安装
tar zxvf redis-3.2.9.tar.gz -C /usr/src/
cd /usr/src/redis-3.2.9/
make && make install
初始化
cd /usr/src/redis-3.2.9/utils/
./install_server.sh //安装服务器脚本(一路回车)
服务进程管理
mv /etc/rc.d/init.d/redis_6379 /etc/rc.d/init.d/redis //改名
chkconfig --add redis
chkconfig redis on
systemctl restart redis
四、redis配置文件选项
vim /etc/redis/6379.conf //Redis的主配置文件
bind 127.0.0.1 192.168.6.20 //监听IP地址(62行)
daemonize yes //启用守护进程
pidfile /var/run/redis_6379.pid //进程ID号管理文件
loglevel notice //日志级别
logfile /var/log/redis_6379.log //日志文件
redis命令工具
redis-cli //进入redis命令行
127.0.0.1:6379> ping //检测redis是否启动
PONG
127.0.0.1:6379> info //查询服务器资源占用信息
help @list //查询list数据类型中相关命令
redis-cli -h 192.168.6.20 -p 6379 //可本地登录、可远程登录(要安装)
五、Redis性能测试
需要一台redis服务器,需要一台redis客户端
客户端设置:(安装完成后)
vim /etc/redis/6379.conf
修改
#bind 127.0.0.1 //加#注释,62行
protected-mode no //将yes改成no,81行
systemctl restart redis
redis-benchmark:redis自带的测试工具,用于测试网络环境,服务器的硬件运行环境。通过发送大量的并发请求,统计测试结果。
-h:指定主机名
-p:端口号
-s:服务器socket
-c:并发连接数
-n:请求数
-d:数据大小,单位字节
-k:保持会话或重置会话 1=keepalive 0=reconnect
-r:SET/GET/INCR 使用随机key
-P:同过管道传输<numreq>请求
-q:强制退出redis
--csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
-I:Idle模式。仅打开N个idle连接并等待
1.向指定服务器发送100个并发连接与1000个请求进行性能测试。不显示过程,只显示统计结果。
redis-benchmark -h 192.168.6.20 -p 6379 -c 100 -n 1000
获得的结果会受到计算机硬件的影响,如CPU性能,内存大小,硬盘读取速度等,也会受到网络传输的影响。
2.测试指定服务器,存取100B大小的数据包的性能
redis-benchmark -h 192.168.6.20 -p 6379 -q -d 100
3.测试指定服务器上,对指定操作的性能
redis-benchmark -h 192.168.6.20 -p 6379 -t set,lpush -n 1000 -q
六、redis的基本操作命令
登录redis:
redis-cli -h 192.168.10.2 -p 6379
在redis中,一个数据库中一张默认的表,表中只有两个字段,key 和 value,库之间没有依赖关系。
1.set 添加数据,如果有同名key的数据,则会覆盖此数据。
格式:
set 键名 值
例:
set k1 345
2.get 查看指定键名的数据值
格式:
get 键名
例:
set k1 345
3.mset 添加多行数据,如果添加的数据值有key重名,则会覆盖之前的数据。
格式:
mset 键名1 值1 键名2 值2 键名3 值3 ......
例:
mset k2 222 k3 333 k4 444
4.setnx 添加数据,但是不覆盖重名key的数据。
格式:
setnx 键名 值
例:
127.0.0.1:6379> setnx k1 000
(integer) 0 //已有数据,无法添加
127.0.0.1:6379> setnx k6 000
(integer) 1 //成功添加数据
127.0.0.1:6379> get k1
"345"
127.0.0.1:6379> get k6
"000"
注意:如果添加成功,则提示信息为1,如果失败则提示0。
5.msetnx 添加多行数据,但不覆盖重名key的数据。
格式:
msetnx 键名1 值1 键名2 值2 ....
例:
127.0.0.1:6379> MSETNX k1 123 k5 456
(integer) 0
127.0.0.1:6379> MSETNX k5 123 k6 456
(integer) 1
127.0.0.1:6379> get k5
"123"
127.0.0.1:6379> get k6
"456"
注意:一旦添加数据出错,则整个命令被中断,其他记录不会被添加。
6. keys 查看key列表
keys * 查看key列表中的所有键名。
格式:keys 键名/*
127.0.0.1:6379> keys * //查询所有
1) "k6"
2) "k2"
3) "k3"
4) "k4"
5) "k1"
127.0.0.1:6379> keys k?
1) "k6"
2) "k2"
3) "k3"
4) "k4"
5) "k1"
7.setex 添加具有生存时间的数据,超过生存时间后,数据会被自动清除。覆盖重名key的数据。
格式:
setex 键名 生存时间 值
例:
setex 2020 10 aaaaaaaaaaa
8.mget 查看多个数据记录
格式:
mget 键名1 键名2 键名3 。。。。。
例:
127.0.0.1:6379> mget k1 k2 k3
1) "345"
2) "222"
3) "333"
9.keys 命令的其他格式
keys k* 查看以k开头的键名
keys *1 查看以1结尾的键名
keys 2020*2 查看以2020开头,以2结尾的键名
10、exists 返回指定的键名是否存在,如果存在返回数值1,不存在返回数值0。一般在程序中进行键名判断时使用此命令。
格式:exists 键名
127.0.0.1:6379> exists k7
(integer) 0 //不存在
127.0.0.1:6379> exists k1
(integer) 1 //存在
11、del 删除指定的键
del 键名
127.0.0.1:6379> del k5
(integer) 0 //删除成功
127.0.0.1:6379> get k5
(nil)
127.0.0.1:6379> del k4 k3 //批量删除
(integer) 2
127.0.0.1:6379> mget k4 k3
1) (nil)
2) (nil)
12、type 查看指定键值的类型
格式:type 键名
127.0.0.1:6379> type k1
string
127.0.0.1:6379> type k2
string
13、rename 修改键名,修改键名不会覆盖内容。如果目标键名已存在,则会覆盖目标键值。
rename 旧键名 新键名
例:
rename 202020522 20200522
14、renamenx 修改键名,如果目标键名存在,则不覆盖目标键值。
格式:renamenx 源键名 新键名
13+14例:
127.0.0.1:6379> set k10 1010
OK
127.0.0.1:6379> set kk10 1011
OK
127.0.0.1:6379> set kk101 10111
OK
127.0.0.1:6379> rename k10 kk10
OK
127.0.0.1:6379> get kk10
"1010"
127.0.0.1:6379> renamenx kk10 kk101
(integer) 0 //因为这里是失败了,所以就没有改名成功(kk10还在)
127.0.0.1:6379> get kk101
"10111"
15、dbsize 统计当前数据库中的key数
127.0.0.1:6379> DBSIZE
(integer) 7
127.0.0.1:6379> keys *
1) "ka1"
2) "k6"
3) "kk7"
4) "kk2"
5) "kk10"
6) "kk101"
7) "k7"
127.0.0.1:6379> set k1 111
OK
127.0.0.1:6379> keys *
1) "ka1"
2) "k6"
3) "kk7"
4) "kk2"
5) "kk10"
6) "kk101"
7) "k7"
8) "k1"
127.0.0.1:6379> DBSIZE
(integer) 8
16、select 切换数据库
redis默认数据库ID号为0,切换数据库时,使用select 数据库ID号。redis最大16个数据库,ID号到15。
select 数据库序号(0-15)
127.0.0.1:6379> select 1 //最初进入的数据库序号为0
OK
127.0.0.1:6379[1]> //序号变了
17、move 移动数据到其他数据库,可以在不同库之间相互移动数据。
move 当前库中的键名 数据库序号
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> KEYS *
1) "k1"
127.0.0.1:6379[2]> move k1 1 //数据库1中没有任何数据内容
(integer) 1
127.0.0.1:6379[2]> KEYS * //数据库2中的k1被移动到数据库1中,所以为空
(empty list or set)
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> KEYS *
1) "k1"
18、flushdb 清除当前数据库中的数据记录
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> KEYS *
(empty list or set)
19、flushall 清除所有数据库中的数据记录
注意:flushdb和flushall命令只能在redis服务器做缓存时使用,千万不要在存储实体数据时使用。
127.0.0.1:6379[1]> flushall
OK
127.0.0.1:6379[1]> SELECT 0 //数据库0中本来有数据,现在全部被删除
OK
127.0.0.1:6379> KEYS *
(empty list or set)
20、incr 增加数值
incr能够对指定键中的数值+1 ,返回增加后的结果。如果值为字符串,则报错,如果键名不存在,则默认创建键名,数值从0开始累加1
格式:incr 键名
127.0.0.1:6379> set k1 111
OK
127.0.0.1:6379> get k1
"111"
127.0.0.1:6379> incr k1
(integer) 112
127.0.0.1:6379> get k1
"112"
21、incrby 指定增加数值量
格式:incrby 键名 增加的数值
127.0.0.1:6379> incrby k1 10
(integer) 122
127.0.0.1:6379> get k1
"122"
22、decr 减少数值
decr能够对指定键中的数值-1,返回较少后的结果。如果键名不存在,则默认从0开始-1。
格式:decr 键名
127.0.0.1:6379> decr k1 //原值为122
(integer) 121
23、decrby 减少指定的数量
格式:decrby 键名 指定减少的数值
127.0.0.1:6379> decrby k1 100 //原值为121
(integer) 21
扩展:
24、hmset 添加数据类型为hash的键值,使用哈希hash值的算法,将多个值写入到一个键名中。
hmset 键名 field1 值1 field2 值2 ....
hmset name field1 zhang1 field2 zhang2
25、hget 查看hash类型的键值,查看hmset添加的键值数据。
hget 键名 field1
26、list(列表) 有序列表,在同一个键名中,添加多个值,并按顺序排序。
添加数据:
lpush 键名 数据
查看数据:
lrange 键名 起始序号 结束序号
27、Set(无序集合) redis的set是string类型的无序集合。
sadd:添加一个string元素到key对应的set集合中,成功返回1,;如果元素已经在集合中返回0。
sadd 键名 数据
smembers:获取指定键值的列表数据(数据的排序结果按照物理输入顺序的降序)
smembers 键名
28、zset(有序集合) redis zset和set一样也是string类型元素的集合,且不允许重复的值。
不同的是每个元素都会关联一个double类型的序号。redis正是通过序号来为集合中的值进行从小到大的排序。zset的值是唯一的,但序号(score)却可以重复
zadd:添加键值到集合,键值在集合中存在则更新对应的score zadd 键名 序号(0.1.2.3.4...) 数值
zrange:获取键命中所有序列中指定位置范围的值 zrange 键名 位置开始 位置结束(0,1,2···) 特殊:ZRANGE a 0 -1 显示整个有序集成员
zrangebyscore:获取指定列表序号中的值 zrangebyscore 键名 列表序号(从0开始,一个数字代表一个整体序号)
凌晨两点的夜市总是那么的繁华: