Redis数据库

Redis超详讲解

Redis百度百科
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  键名11  键名22  键名33  ......
例:
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  键名11  键名22 ....
例:
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-15127.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开始,一个数字代表一个整体序号)

凌晨两点的夜市总是那么的繁华:
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光落入你灰蒙蒙的眼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值