赞
踩
sql:结构化数据库,可通过二维表格形式表述这个数据,存储结构化数据,别称关系型数据库
nosql:非结构化数据库,存储非结构化数据,别称非关系型数据库,例:Redis、Memcached
High performance–对数据库高并发读写需求
Huge Storage–对海量数据高效存储与访问需求
High Scalability && High Availability–对数据库高可扩展性与高可用性需求
Memcached | Redis | |
类型 | Key-value数据库 | Key-value数据库 |
过期策略 | 支持 | 支持 |
数据类型 | 单一数据类型 | 五大数据类型 |
持久化 | 不支持 | 支持 |
主从复制 | 不支持 | 支持 |
虚拟内存 | 不支持 | 支持 |
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化对象
string类型是redis最基本的数据类型,string类型的值最大能存储512M
set string1 10 ##设置键值对:set 键 值,表示string1值为10
get string1 ##获取键的值:get 键
10
Incr string1 ##键值自增1
11
Decr string1 ##键值自减1
10
Decrby string1 5 #键值自减5(自定义)
5
Incrby string1 7 #键值自增7(自定义)
12
Redis hash是一个键值(key=>value)对集合
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
场景:存储、读取、修改用户属性
hset hash1 key1 a #hset添加hash数据
hset hash1 key2 b
hset hash1 key3 c
hset hash1 field1 a1 field2 a2
hget hash1 key1 #hget获取hash数据
a
hmget hash1 key1 key2 key3 #hmget获取多个hash数据
a b c
Redis列表是简单的字符串列表,按照插入顺序,可以添加一个元素到列表的头部(左边)或者尾部(右边)
场景:最新消息排行等功能、消息队列
lpush list1 1 #lpush从左边推入值
lpush list1 2
lpush list1 3
lien list1 #lien查看某个list数据类型的长度
3
rpop list1 #rpop从右边弹出值
1
lien list1
2
lpop list1 #lpop从左边弹出值
3
rpush list2 1 #rpush从右边推入值
Redis的set是string类型的无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
场景:共同好友、好友推荐
sadd set1 12 #sadd key member添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0
1
sadd set1 13
1
sadd set1 12
0
scard set1 #scard查看set数据中存在的元素个数
2
sismember set1 11 #sismember判断set数据中是否存在某个元素
0
sismember set1 13
1
srem set1 12 #srem删除某个set数据中的元素
Redis zset和set一样也是string类型元素的集合,且不允许重复的值
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
场景:排行榜、带权重的消息队列
zadd zset1 1.1 val1 #zadd key score member天啊及元素到集合,元素在集合中存在则更新对应score
zadd zset1 2.2 val2
zcard #查询
zrang #数据排序
编译安装
tar -zxvf redis-5.0.4.tar.gz
make && make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/* /usr/bin/
cd redis-5.0.4/utils/
./install_server.sh ##交互式安装,指定各种文件目录
管理redis服务
/etc/init.d/redis_6379 stop #关闭服务
/etc/init.d/redis_6379 start #开启服务
/etc/init.d/redis_6379 restart #重启服务
/etc/init.d/redis_6379 status #查看服务运行状态
修改配置文件
vi /etc/redis/6379.conf
bind 127.0.0.1 192.168.20.80 #监听地址,增加本机IP
port 6379 #默认端口号6379
daemonize yes #启用守护进程
pidfile /var/run/redis_6379.pid #指定PID文件
loglevel notice #日志级别
logfile /var/log/redis_6379.log #指定日志文件
dir /var/lib/redis/6379 #指定本地数据库存放目录
连接redis数据库
/usr/local/redis/bin/redis-cli #连接本地数据库
redis-cli -h 192.168.20.80|-p 6379 #连接远程数据库
连接后操作
ping #检测redis服务是否启动
exit/quit #退出
reids命令工具
redis-server #用于启动redis
redis-benchmark #用于检测redis在本机的运行效率
redis-check-aof #修复AOF持久化文件
redis-check-rdb #修复RDB持久化文件
redis-cli #redis命令行工具
redis-setimel #哨兵模式启动工具
redis-benchmark是官方自带的redis性能测试工具,可以有效的测试redis服务性能
基本语法为:redis-benchmark 【option】 【option value】
选项(option):
-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连接并等待
向IP为192.168.20.80、端口号为6379的redis服务器发送100个并发连接与100000个请求测试性能
redis-benchmark -h 192.168.20.80 -p 6379 -c 100 -n 100000
单独测试某项操作性能
redis-benchmark -t set,get -n 100000 -q
部分效果(string数据类型读写性能)
redis支持多数据库,默认支持16个数据库,0-15命名
多数据库相互独立,互不干扰
1.keys
使用keys命令可以取符合规则的键值列表,通常可以结合*、?等选项来使用
set k1 1 set k2 2 set v33 3 set v4 4 keys * #查看当前数据库中所有键 1)k1 2)k2 3)v33 4)v4 keys k* #查看当前数据库中以k开头的所有键 1)k1 2)k2 keys v? #查看当前数据库中以v开头并只跟了一个参数的键 1)v4 keys v?? #查看当前数据库以v开头并跟了两个参数的键 1)v33
del命令可以删除当前数据库指定的key
keys *
1)k1
2)k2
del k2 #删除k2
(integer)1
get k2
(nil)
exists命令可以判断键值是否存在
exists k1
(integer)1 #表示键存在
exists k2
(integer)0 #表示不存在
redis数据库的整库数据删除主要分为两个部分:1,清空当前数据库数据,2,使用flushdb清空所有数据库数据
flushdb #清空所有数据库数据
ok #返回删除完成确认
redis数据库提供了一个move命令,可以进行多数据库的数据移动,命令的基本语法格式为move key dbindex,启动key表示目标键,dbindex表示目标序号
select 0 #切换至目标数据库0
get k1 #查看是否存在
move k1 1 #将数据库0中的k1移动到数据库1中
get k1 #数据此时不存在
select 1
get k1 #数据存在数据库1中
redis支持多数据库,在redis没有任何改动的情况下默认包含16个数据库,数据库名称是用数字0-15一次命名,使用select可以进行redis的多数据库之间的切换,命名格式为select index,index表示数据库序号,使用redis-cli连接数据库后,默认使用序号为0的数据库
select 15 ##切换至数据库15
rename命令是对已有key进行重命名,格式为rename 源key 目标key,使用rename进行重命名时,无论目标key是否存在都进行重命名,且源key的值会覆盖目标key的值,在实际使用过程中,建议先用exists命令查看目标key是否存在,再决定是否重命名,以避免覆盖数据
keys v*
1)v3
2)v4
get v3
3
rename v3 v2
keys v*
1)v2
2)v4
get v2
3
renamenx命令作用是对已有key进行重命名,并检测新名是否存在,其命令格式与rename的命令格式除命令关键字不同外基本相同,renamenx 源key 目标key,使用renamenx命令进行重命名时,如果目标key存在则不进行重命名
keys *
1)k1
2)k2
renamenx k1 k2
(integer)0 #失败
使用type可以获取key对应的value值类型
type k1
string #查询到为字符串型
持久化概述
Redis是运行在内存中,内存中的数据断电丢失
为了能够重用Redis数据,或者放置系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
持久化分类
RDB:创建快照的方式获取某一时刻Redis中所有数据的副本
AOF:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
RDB和AOF的区别
·RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入到临时文件,写入成功后,在替换之前的文件,用二进制压缩存储
·AOF持久化以日志的形式记录服务器所处理的每一个写,删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录
触发条件
在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
执行save或bgsave(异步)命令
执行flushall命令,清空数据库所有数据
执行shutdown命令,保证服务器正常关闭且不丢失任何数据
通过RDB文件恢复数据
将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
配置文件选项
vi /etc/redis/6379.conf
save 900 1 #900秒之内至少一次写操作
save 300 10 #300秒内至少发生10次写操作
save 60 10000 #60秒内发生至少10000次写操作
#只要满足其一都会触发快照操作,注释所有的save项表示关闭RDB
dbfilename dump.rdb #RDB文件名称
dir /var/lib/redis/6379 #RDB文件路径
rdbcompression yes #是否进行压缩
Redis默认不开启
弥补RDB的不足(数据的不一致性)
采用日志的形式来记录每个写操作,并追加到文件中
Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
根据AOF文件恢复数据
根据AOF文件恢复数据
将appendonly.aof文件拷贝到Redis安装目录的bin目录下,重启Redis服务即可
配置文件选项
vi /etc/redis/6379.conf
appendonly yes #开启AOF持久化
appendfilename "appendonly.aof" #AOF文件名称
#appendfsync always #同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec #默认推荐,每秒异步记录一次(默认值)
#appendfsync no #不同步,交给操作系统决定如何同步
aof-load-truncated yes #忽略最后一条可能存在问题的指令
AOF的重写机制
AOF的工作原理是将写操作追加到文件中,问价你的冗余内容会越来越多
当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩
AOF重写的原理
Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件
AOF重写配置
vi /etc/redis/6379.conf
no-appendfsync-on-rewrite no
#在日志进行BGREWRITEAOF时, 如果设置为yes表示新写操作不进行同步fsync,只暂存在缓冲区里,避免造成磁盘I0操作冲突,等重写完成后在写入。redis中默认为no
auto-aof-rewrite-percentage 100
#当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作
auto-aof-rewrite-min-size 64mb
#当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF.即当AOF文件到达64M时,执行BGREWRITEAOF命令
127.0.0.1:6379> info memory
# Memory
used_memory:2650536
used_memory_human:2.53M
## 内存使用总量
used_memory_rss:12120064
used_memory_rss_human:11.56M
used_memory_peak:2650536
used_memory_peak_human:2.53K
...
mem_fragmentation_ratio:4.57
## 内存碎片率
volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。