目录
一、关系型数据库与非关系型数据库
1.1 关系型数据库
一个结构化的数据库,创建在关系模型基础上
一般面向于记录
包括:
Oracle、MySQL、SQL Server、Microsoft Acesss、DB2等
1.2 非关系型数据库
除了主流的关系型数据库外的数据库,都认为是非关系型数据库
包括:
Redis、MongoDB、Hbase、CouhDB等
1.3 非关系型数据库产生背景
High performance—对数据库高并发读写要求
Huge Storage—对海量数据高效存储与访问需求
High Scalability && High Availability----对数据库高可扩展性与高可用性需求
二、Redis简介
2.1 简介
Redis基于内存运行并支持持久化
采用key-value(键值对)的存储方式
优点:
★具有极高的数据读写速度,数据读取的速度最高可达到11万次/秒,数据写入速度最高可达到8万次/秒
★支持丰富的数据类型,不仅仅支持简单的key-value类型的数据,还支持strings、lists、hashes、sets以及ordered sets等数据类型操作
★支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
★原子性,redis所有操作都是原子性的
★支持数据备份,即master-slave模式的数据备份
★redis作为基于内存运行的数据库,缓存时其最长应用的场景之一,除此之外,redis常见应用场景还包括:获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录
★redis (remotedictionaryserver,远程字典型)是一个开源、使用C语言编写的nosql数据库
★redis基于内存运行并支持持久化,采用key-value键值对的存储形式,是目前分布式架构中不可或缺的一环
★redis服务器程序是单进程模型,也就是在一台服务器上可以同时运行多个redis进程,而redis的实际处理速度则是完全依靠于主进程的执行效率
★若是在服务器上只运行一个redis进程,当多个客户端同时访问,服务器的处理能力会有一定程度的下降;
★若是在同一台服务器上开启多个redis进程,redis会提高并发处理能力的会给服务器的cpu造成很大的压力
★也就是说在实际生产环境中,需要根据实际的需求来决定开启多少个redis进程
若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程;
★若CPU资源比较紧张,采用单进程即可
2.2 安装部署
操作步骤:
解压软件包----》make && make install----》设置Redis相关配置文件----》查看运行状态
2.2.1 编译安装
将软件包上传到/opt目录下
yum -y install gcc gcc-c++ make
cd /opt
tar zxvf redis-5.0.7.tar.gz
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis/ install
cd /opt/redis-5.0.7/
cd utils/
./install_server.sh
//这个脚本在安装包的utils内
Please select the redis port for this instance: [6379] //回车,此处是端口号
Please select the redis config file name [/etc/redis/6379.conf] //回车,此处是配置文件位置
Please select the redis log file name [/var/log/redis_6379.log] //回车,此处是日志文件位置
Please select the data directory for this instance [/var/lib/redis/6379] //回车,数据文件存放位置
Please select the redis executable path [] //扩展路径,需要自己输入/usr/local/redis/bin/redis-server,不可以删除,写的时候注意
Is this ok? Then press ENTER to go on or Ctrl-C to abort. //回车
Port : 6379
Config file : /etc/redis/6379.conf ###配置文件路径
Log file : /var/log/redis_6379.log ####日志文件路径
Data dir : /var/lib/redis/6379 ####数据文件路径
Executable : /usr/local/redis/bin/redis-server ####可执行文件路径
Cli Executable : /usr/local/bin/redis-cli ####客户端命令行工具
Installation successful! //完成
cd /etc/redis/
ls
6379.conf //主配置文件
ln -s /usr/local/redis/bin/* /usr/local/bin/
netstat -natp | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 21765/redis-server
//此时已经运行
2.2.2 关闭开启操作
/etc/init.d/redis_6379 stop
Stopping …
Waiting for Redis to shutdown …
Redis stopped
netstat -natp | grep 6379
tcp 0 0 127.0.0.1:6379 127.0.0.1:40470 TIME_WAIT -
/etc/init.d/redis_6379 start
Starting Redis server…
2.3 连接数据库
redis-cli -h 20.0.0.18 -p 6379 //连接redis
Could not connect to Redis at 192.168.247.206:6379: Connection refused
//显示不可以连接,是因为服务还没有完全启用,不-h -p指定IP,本地可以直接登陆,若是想要指定IP地址,就需要在配置文件内添加监听地址
vi /etc/redis/6379.conf
###########################################################
//bind 127.0.0.1 20.0.0.18 ###需要更改 加本端的IP地址
//port 6379 ###默认不需要更改 端口
//daemonize yes ###默认不需要更改 启用守护进程
//pidfile /var/run/redis_6379.pid ###默认不需要更改 指定 PID 文件
//loglevel notice ###默认不需要更改 日志级别
//logfile /var/log/redis_6379.log ###默认不需要更改 指定日志文件
not connected> exit
############################################################
/etc/init.d/redis_6379 restart
//重启
redis-cli -h 20.0.0.18 -p 6379
//连接redis成功
三、Redis基本操作
3.1 基本操作
Redis 软件提供了多个命令工具, 当 Redis 安装时, 所包含的软件工具会同时被安装到
系统中, 在系统中可以直接使用。 这些命令工具的作用分别如下所示。
●redis-server: 用于启动 Redis 的工具
●redis-benchmark: 用于检测 Redis 在本机的运行效率
●redis-check-aof: 修复 AOF 持久化文件
●redis-check-rdb: 修复 RDB 持久化文件
●redis-cli: 是 Redis 命令行工具
●redis-setinel: 是 redis-server 文件的软链接
3.2 redis-cli
★在进行数据库连接操作时, 可以通过选项来指定远程主机上的 Redis 数据库, 命令语法为 redis-cli -h host -p port -a password。 其中, -h 指定远程主机、 -p 指定 Redis 服务的端口号、 -a 指定密码。 若不添加任何选项表示, 连接本机上的 Redis 数据库; 若未设置数据库密码可以省略-a 选项。 例如执行以下命令可连接到主机为 20.0.0.18, 端口为 6379 的 Redis 数据库, 并查看 redis 服务的统计信息。 若要退出数据库操作环境, 执行“exit” 或“quit” 命令即可返还原来的 Shell 环境
set: 存放数据, 基本的命令格式为 set key value。
get: 获取数据, 基本的命令格式为 get key。
keys: 可以取符合规则的键值列表, 通常情况可以结合、 ? 等选项来使用
exists:可以判断键值是否存在。
del:可以删除当前数据库的指定 key
type:可以获取 key 对应的 value 值类型
rename:是对已有 key 进行重命名, 其命令格式为: rename 源 key 目标 key。
使用rename 命令进行重命名时, 无论目标 key 是否存在都进行重命名, 且源 key 的值会覆盖目
标 key 的值。*
在实际使用过程中, 建议先用 exists 命令查看目标 key 是否存在, 然后再决定是否执行 rename 命令以避免覆盖重要数据renamenx:作用是对已有 key 进行重命名, 并检测新名是否存在。其命令格式与rename 的命令格式除命令关键字不同外基本相同, renamenx 源 key 目标 key。使用renamenx 命令进行重命名时, 如果目标 key 存在则不进行重命名dbsize:查看当前数据库中 key 的数目
3.3 redis-benchmark 测试工具
redis-benchmark 是官方自带的 Redis 性能测试工具, 可以有效的测试 Redis 服务的性能。 基本的测试语法为 redis-benchmark [option] [option value]。
-h: 指定服务器主机名。
-p: 指定服务器端口。
-s: 指定服务器 socket。
-c: 指定并发连接数。
-n: 指定请求数。
-d: 以字节的形式指定 SET/GET 值的数据大小。
-k: 1=keep alive 0=reconnect 。
-r: SET/GET/INCR 使用随机 key, SADD 使用随机值。
-P: 通过管道传输请求。
-q: 强制退出 redis。 仅显示 query/sec 值。
–csv: 以 CSV 格式输出。
-l: 生成循环, 永久执行测试。
-t: 仅运行以逗号分隔的测试命令列表。
-I: Idle 模式。 仅打开 N 个 idle 连接并等待。
20.0.0.18 -p 6379 -c 100 -n 100000
//命令即可向 IP 地址为 20.0.0.18, 端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求测试性能。
redis-benchmark -h 20.0.0.18 -p 6379 -c 100 -n 100000
====== SET ======
100000 requests completed in 1.54 seconds
====== GET ======
100000 requests completed in 1.47 seconds
redis-benchmark -h 20.0.0.18 -p 6379 -q -d 100
//-q 强制退出 -d 100字节
多次测试,取其平均值,才能作为衡量标准,还可以测试某些操作的性能, 例如执行 redis-benchmark -t set,lpush -n 100000 -q命令的作用是测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能。
redis-benchmark -t set,lpush -n 100000 -q
SET: 105708.25 requests per second
LPUSH: 109289.62 requests per second
3.4 测试库与库
多数据库间切换:Redis 支持多数据库, Redis 在没有任何改动的情况下默认包含 16 个数据库, 数据库名称是用数字 0-15 来依次命名的。
使用 Select 命令可以进行 Redis 的多数据库之间的切换,命令格式为 selectindex,其中 index 表示数据库的序号。
而使用 redis-cli 连接 Redis 数据库后, 默认使用的是序号为 0 的数据库。
如下所示, 使用 select 命令切换数据库后, 会在前端的提示符中显示当前所在的数据库序号如“20.0.0.18:6379[10]>” 表示当前使用的是序号为 10 的数据库;
若当前使用的数据库是序号为 0 的数据库, 提示符中则不显示序号, 如“20.0.0.18:6379>” 表示当前使用的是序号为 0 的数据库。
//Redis 的多数据库在一定程度上是相对独立的,
//例如在数据库 0 上面存放的 t1 的数据,在其它的 1-15 的数据库上是无法查看到的。
20.0.0.18:6379> select 10
//切换到第10个库
20.0.0.18:6379[10]> keys *
//现在是空的
(empty list or set)
20.0.0.18:6379[10]> select 0
//切换到第0个库
//Redis 数据库提供了一个 move 的命令, 可以进行多数据库的数据移动。
//命令的基本语法格式为” move key dbindex“。
//其中“key“表示当前数据库的目标键,“dbindex “表示目标数据库的序号。
20.0.0.18:6379> MOVE t1 10
//移动t1到第11个库
(integer) 1
20.0.0.18:6379> keys *
- “counter:rand_int”
- “mylist”
- “key:rand_int”
- “myset:rand_int”
20.0.0.18:6379> select 10
20.0.0.18:6379[10]> keys *
- “t1”
20.0.0.18:6379[10]> flushdb
//清空当前的库,flushall 是清空所有,建议别记
20.0.0.18:6379[10]> keys *
(empty list or set)
3.5 常用命令
help @list
//验证帮助信息——列表信息
info
//查看当前redis信息
help set
//查看set的帮助信息
set teacher zhangsan
set tea red
KEYS *
//这个命令少用,在生产环境中因为keys特别多,查看所有会有卡顿,严重的话还有可能会宕机
- “tea”
- “teacher”
keys t?? //?代表未知一个字符
- “tea”
keys t???
- “teacher”
get tea
“red”
//也可以使用制表符补全
EXISTS tea //查看是否存在tea键
(integer) 1
EXISTS te
(integer) 0
DEL teacher
(integer) 1
keys *
- “tea”
type tea
string
rename tea t1
//重命令键
get t1
“red”
3.6 Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
3.6.1 String(字符串)
string是redis最基本的类型,可以理解成与memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的,redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
string类型是redis最基本的数据类型,string类型的值最大能存储512M。
示例:
20.0.0.18:6379> set name zhangsan
OK
20.0.0.18:6379> get name
“zhangsan”
3.6.2 Hash(哈希字典)
Redis hash是一个键值(key=value)对集合。
Redis hash是一个string类型的field和value的映像表,hash特别适合用于存储对象,每个hash可以存储2的32次方-1键值对。
作用场景:
键值对集合,即编程语言中的map类型,适合存储对象,并且可以像数据库中update一个属性一样只能修改某一项属性值
示例:
20.0.0.18:6379> hmset stu name lisi age 18 sex 男
OK
20.0.0.18:6379> hget stu name
“lisi”
20.0.0.18:6379> hget stu age
“18”
3.6.3 list(列表)
Redis列表是最简单的字符串列表,按照插入顺序排序,可以重复,可以添加一个元素到列表的头部(左边)或者尾部(右边),列表最多可存储2的32次方-1元素。
作用场景:
增删快,提供了操作某一段元素的API
1.最新消息排行等功能(比如朋友圈的时间线)
2.消息队列
20.0.0.18:6379> lpush hobby play
1
20.0.0.18:6379> lpush hobby read
2
20.0.0.18:6379> lpush hobby sport
3
20.0.0.18:6379> lrange hobby 0 10
sport
read
play
3.6.4 set(集合)
Redis的set是string类型的无序集合。
集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是0(1)
作用场景:
1.共同好友
2.利用唯一性,统计访问网站的所有独立ip
3.好友推荐时,根据tag求交集,大于某个阈值就可以推荐
sadd命令:
添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0
示例:
20.0.0.18:6379> sadd color red green yellow
3
20.0.0.18:6379> smembers color
red
yellow
green
20.0.0.18:6379> sadd color red
0
3.6.5 zset(sorted set:有序集合)
Redis zset 和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset成员是惟一的,但分数可以重复。
作用场景:
将set中的元素增加一个权重参数score,元素按score有序排列。数据插入集合时,已经进行天然排序。
1.排行榜
2.带权重的消息队列
zadd命令:
添加元素到集合,元素在集合中存在则更新对应score
示例:
20.0.0.18:6379> zadd color 0 red
1
20.0.0.18:6379> zadd color 0 blue
1
20.0.0.18:6379> zadd color 1 green
1
20.0.0.18:6379> zadd color 1 yellow
1
20.0.0.18:6379> zrangebyscore color 0 10
blue
red
green
yellow
重命名(rename):
20.0.0.18:6379> rename name na
OK
20.0.0.18:6379> get na
zhangsan
设置超时时间(PEXPIRE)单位:毫秒
20.0.0.18:6379> PEXPIRE na 3000
1
20.0.0.18:6379> get na
查看剩余时间PTTL(单位:毫秒)
20.0.0.18:6379> PEXPIRE name 30000
1
20.0.0.18:6379> PTTL name
取消超时时间:
20.0.0.18:6379> set name zhangsan
OK
20.0.0.18:6379> PEXPIRE name 50000
1
20.0.0.18:6379> PTTL name
44666
20.0.0.18:6379> PERSIST name
1
20.0.0.18:6379> PTTL name
-1
20.0.0.18:6379> get name
zhangsan
随机返回key RANDOMKEY
20.0.0.18:6379> mset age 18 score 89 sex boy
OK
20.0.0.18:6379> RANDOMKEY
sex
20.0.0.18:6379> RANDOMKEY
color
20.0.0.18:6379> RANDOMKEY
sex
查看所有key:
20.0.0.18:6379> KEYS *
color
score
sex
age