Redis
官网:https://redis.io
特点:
(1)它是一个基于Key-Value的存储,单线程
(2)可用作Cache and store(既可以用作缓存服务,也可以用作存储服务)
(3)工作在内存中
支持:
1 持久化(redis会在一定时间内将内存中的数据写入到硬盘中从而实现数据持久化)
基于Snapshotting方式(数据异步从内存传输到硬盘中)
基于AOF方式(把每一次的写操作都存放在现有的文件中)
2 主从(借助于sentine实现一定意义上的高可用,可像Mysql主从一样,主实现写操作,从实现读操作)
3 cluster(分布式集群,读写操作可在多节点进行)
4 就地更新(可在内存中直接更新)
数据结构服务器
支持存储:
string(字符串)、list(列表)、hash(关联数组)、set(集合)、sorted_set(有序集合)、Bitmaps、Hyperloglog
1 Memcached是一个分布式的内存对象缓存系统
Redis是可以实现持久存储的
2 Memcached是一个LRU的缓存,会把最近最少使用的数据都清理掉
Redis拥有更多特性,支持存储更多的类型(string,lists,hash,set....)
3 Memcached是多线程的
Redis是单线程的
4 二者性能几乎不相上下
存储系统常见分类
1 RDBMS(关系型数据库):Mysql、Oracle、DB2、SQL Server....
2 NoSQL(非关系型数据库):Redis、MongoDB、HBase.....
3 NewSQL(支持分布式的关系型数据库):Aerospike、FoundationDB....
NoSQL常见有四种流派
1 Key-Value NoSQL(键值存储NoSQL)
Memcached、Redis...
2 Column family NoSQL(列式存储NoSQL)
HBase...
3 Documentation NoSQL(文档存储NoSQL)
MongoDB...
4 Graph NoSQL(图式存储NoSQL)
Neo4j...
Redis的组件
1 redis-server
2 redis-cli
3 redis-benchmark(性能压力测试)
4 redis-check-dump & redis-check-aof(检查Redis持久化之后的文件中(AOF/RDB)是否出现错误)
安装Redis:(有两种方式,此处采用yum安装,前面文章有编译安装)
[root@bogon ~]# yum search epel #在yum中搜索epel源
[root@bogon ~]# yum install epel-release #安装epel源
[root@bogon ~]# yum install redis #直接用yum安装,在Centos7上,现在的redis版本应该都是3.2
[root@bogon ~]# cat redis.conf
全局配置:
daemonize no #redis默认启动后会运行在前台界面,默认是关闭守护进程的,开启后redis会在后台以守护进程方式运行
pidfile /var/run/redis_6379.pid #指定了redis启动后pid的存放位置
port 6379 #redis默认监听端口为TCP的6379
tcp-backlog 511 #tcp-backlog长度
tcp-backlog:任何tcp服务都有可能用到此功能,等待队列功能
例:当并发量过高,访问过多的时候,redis忙不过来的话,就会将新的请求存放在tcp-backlog中
bind 127.0.0.1 #redis的监听地址,默认监听在127.0.0.1上
unixsocket /tmp/redis.sock #定义socket的文件位置,当在同一台服务器上进行通信时,采取sock方式就不用去走tcp/ip等协议了,在内存中直接交换,更加快捷
unixsocketperm 700 #socket的访问权限
timeout 0 #当客户端连接空闲多久后显示超时,默认不开启
持久化配置
save 900 1 #在900秒内,如果有一个键发生改变,那么就做一次快照,做一次持久化
save 300 10 #在300秒内,有十个键发生改变,那么就做一次快照,做一次持久化
save 60 10000 #在60秒内,有10000个键发生改变,那么就做一次快照,做一次持久化
Note:如果要禁用redis的持久化功能,在配置文件中输入save "" 就是代表禁用
主从配置
slaveof <masterip> <masterport> #这项不启用的话,此redis就是主,这项取消注释启用的话,这台就是从,后边跟主redis的ip和端口
主从复制配置(当然前提是slaveof要开启的)
slave-read-only yes #从redis采用只读模式
安全相关配置
maxclients 10000 #最大客户端并发数量,默认此选项为注释
maxmemory <bytes> #最多允许redis在当前主机上使用多少内存
APPEND ONLY MODE:一有修改就将修改的数值存储在一个文件中,类似Mysql的二进制日志
appendonly no #默认是禁用的,可以同时启用此模式和snapshotting模式
Redis命令操作
# systemctl start redis #使用yum安装的话则可以直接启动
# redis-cli -h #查看此命令的帮助
-h:指定服务器地址
-p:指定端口
-s:指定socket位置
-a:指定密码
# redis-cli #什么选项都不加的话,则说明连接本地的redis
127.0.0.1:6379>exit #这就是登录进redis后的提示符(exit是退出)
Redis交互式帮助用法
127.0.0.1:6379>help #这样会获取help指令的用法,因为redis支持多种数据类型,所以查看帮助的话也是需要指定
redis-cli 3.2.10
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
To set redis-cli perferences:
":set hints" enable online hints
":set nohints" disable online hints
Set your preferences in ~/.redisclirc
127.0.0.1:6379>help @string #查看到的是关于string数据类型的一系列帮助信息(敲完help @之后按tab键会有补全功能)
@list
@hash
....
127.0.0.1:6379> HELP append #就是获取数组中单个指令的帮助信息
127.0.0.1:6379> HELP @server #获取关于服务的帮助信息
CLIENT LIST #可以查看当前客户端的连接信息
CLIENT KILL #杀掉客户端进程
SLAVEOF #后面直接跟master的IP以及端口就可以直接作为master的从了
Redis基于键值存储,下面说一下Key(键)
1 可以使用ASCII编码中的字符当键,键的长度不要太长(键越长消耗空间越多)
2 键可以实现自动过期
3 在同一个名称空间内,键名是不允许重复的,我们对同一个键操作的话意味的是我们要改键值了并不是要创建新键
例:
127.0.0.1:6379>SELECT 1 (打开1号名称空间)
2 (打开2号名称空间,0是我们默认的名称空间,最多可以打开16个)
Redis众多数据类型中的常用命令
Strings:
(1) SET :是定义值的时候用的
(2) GET :获取键的值时候用的
(3) EXISTS :判断键是否存在
(4) INCR :整数+1
(5) DECR :整数减-1
127.0.0.1:6379> HELP SET #查看SET的用法
127.0.0.1:6379> SET name test #定义一个键名为name,而name对应的值为test
OK
127.0.0.1:6379> GET name #可以换取name这个键的值
"test"
127.0.0.1:6379> SET name centos #如果再次定义的话,新的值就会覆盖旧的值,所以同一个名称空间中键不允许重复
OK
127.0.0.1:6379> GET name
"centos"
127.0.0.1:6379> APPEND name rhel #追加新的值到name键中
(integer) 10 #显示了追加后的name键对应值的字符串长度
127.0.0.1:6379> GET name
"centosrhel"
127.0.0.1:6379> STRLEN name #手动获取name键对应值的字符串长度
(integer) 10
127.0.0.1:6379> SET count 0 #定义名为count的键,值为0
OK
127.0.0.1:6379> INCR count #使count的值加1,执行一次加一次1,你可以多执行几次再看看值,此处就不再重复演示
(integer) 1
127.0.0.1:6379> DECR count #使count的值减1,执行一次减一次1,也会达到负数,多执行几次看一下
(integer) 2 #我上面执行了三遍INCR所以执行一次DECR就是2,在执行就是1,在执行就是0
127.0.0.1:6379> SET name centos NX #执行会失败,NX的意思是当键中没有值的时候才会设定键,否则不会设定
(nil)
127.0.0.1:6379> SET name2 centos XX #执行会失败,XX的意思就是当键中有值的时候才会设定键,否则不会设定
(nil)
127.0.0.1:6379> SET name centos XX EX 10 #表示name键有值的时候才会赋值,并且赋值完成后过10秒后自动过期
list(列表):
(1) RPUSH :从右侧添加一个值到列表中
(2) LPUSH :从左侧添加一个值到列表中
(3) LPOP :从左侧逐一删除值
(4) RPOP :从右侧逐一删除值
(5) LINDEX :指明索引位置并且获取值
(6) LSET :修改列表中的值
127.0.0.1:6379> HELP @list #查看list数组中的相关帮助
127.0.0.1:6379> LPUSH l1 mon #从左侧生成一个名为l1的列表
(integer) 1
127.0.0.1:6379> LINDEX l1 0 #查看名为l1的列表,并且指定第一个值的位置
"mon"
127.0.0.1:6379> LPUSH l1 sun #从左侧新添加一个值为sun到l1列表中
(integer) 2
127.0.0.1:6379> LINDEX l1 1 #此时原本在0这个位置的mon位置就会变成了1,因为前面挤了一个sun
"mon"
127.0.0.1:6379> LINDEX l1 0 #获取的就是sun的值,因为从左侧新添加的,所以第一个必定是新添加的值
"sun"
127.0.0.1:6379> RPUSH l1 tue #从右侧新添加一个值为tue到l1列表中
(integer) 3
127.0.0.1:6379> LINDEX l1 2 #查看到的结果就是tue,因为从左侧添加,则0必定是新添加的值,而从右侧添加,则最后一个值必定是新添加的值
"tue"
127.0.0.1:6379> LSET l1 1 fri #修改l1列表中位置在1上的值为fri,那么原本在1上面的mon就会被替换为fri
OK
127.0.0.1:6379> RPOP l1 #删除从右侧开始的第一个值,执行后会删除tue
"tue"
Sets(集合):
(1) SADD :创建新的集合
(2) SINTER :求两个集合的交集
(3) SUNION :求两个集合的并集,就是两个集合中都存在的,并且打印出来一份
(4) SISMEMBER:判断集合中指定的元素是否存在
(5) SPOP :从集合中随机删除一个元素
127.0.0.1:6379> HELP @set #查看set数组中的相关帮助
127.0.0.1:6379> SADD v1 mon tue wen thu fri sat sun #创建一个名为v1的集合,并且包含的内容为"mon,tue,wen...sun"
(integer) 7
127.0.0.1:6379> SADD v2 tue thu day #创建一个名为v2的集合,并且包含的内容为"tue,thu,day"
(integer) 3
127.0.0.1:6379> SINTER v1 v2 #对比两个集合中是否存在交集
1) "thu" #如果两个集合中有相同的值,那么会显示在屏幕上
2) "tue"
127.0.0.1:6379> SUNION v1 v2 #对比两个集合中的并集
1) "sun"
2) "mon"
3) "tue"
4) "thu"
5) "wed"
6) "fri"
7) "sat" #这个值只在v1中,但是还是打印出来了,就是v1中存在的打印出来
8) "day" #这个值只在v2中,但是还是打印出来了,就是v2中存在的也打印出来
127.0.0.1:6379> SPOP v1 #删除并弹出v1中的其中一个值,这个值是随机的
"wed"
127.0.0.1:6379> SISMEMBER v1 wed #判断集合中的wed是否还是一个元素
(integer) 0 #因为上面SPOP随机在v1中删除了一个元素,所以此时判断则为0
Sorted Sets(有序集合):
(1) ZADD :添加一个有序集合
(2) ZCARD :查看有序集合的元素个数
(3) ZRANK :查看指定元素对应的SCORE号
(4) ZRANGE :按照内置索引显示从"min-max"之间的索引
127.0.0.1:6379> HELP @sorted_set #查看sorted_set中的相关帮助
127.0.0.1:6379> ZADD weekday1 1 mon 2 tue 3 wed #添加名为weekday1的集合,值用(1,2,3)来指定SCORE,SCORE后面跟值
(integer) 3
127.0.0.1:6379> ZCARD weekday1 #获取有序集合的元素个数
(integer) 3
127.0.0.1:6379> ZRANK weekday1 tue #查看weekday1中tue元素对应的索引号
(integer) 1
127.0.0.1:6379> ZRANK weekday1 mon #SCORE数字大小决定了你的排序(因为我们有内置索引),如果从1开始定义,那么1对应的mon就会是0
(integer) 0
127.0.0.1:6379> ZSCORE weekday1 tue #根据元素来获取SCORE
"2"
127.0.0.1:6379> ZRANGE weekday1 0 1 #显示weekday1中按照内置索引从0到1之间的所有元素
0)"mon"
1)"tue"
Hashes(哈希):
(1) HSET :定义一个hash
(2) HGET :获取键中子键对应的值
(3) HDEL :删除键中子键
(4) HKEYS :获取h1键中所有的子键名称
(5) HVALES :获取h1键中所有子键对应的值
(6) HLEN :获取h1键中拥有的hash个数
127.0.0.1:6379> HELP @hash #查看Hash数组的相关帮助
127.0.0.1:6379> HSET h1 a mon #创建一个h1键,定义当中有名为a对应mon的hash
(integer) 1
127.0.0.1:6379> HGET h1 a #获取h1键中a对应的值,定义的时候对应的是什么这里显示就会是什么
"mon"
127.0.0.1:6379> HSET h1 b tue #在h1键中重新添加一个名为b对应tue的hash
(integer) 1
127.0.0.1:6379> HDEL h1 b #删除某一个键下的子键对应的值
"tue"
127.0.0.1:6379> HKEYS h1 #能够获取h1键中所有的子键名称
1) "a"
127.0.0.1:6379> HVALS h1 #能够获取h1键中所有的子键对应的值
1) "mon"
127.0.0.1:6379> HLEN h1 #获取h1键中拥有的hash个数
(integer) 1