Redis介绍、安装、持久化、数据类型、常用操作、安全设置
原创Asnfy 发布于2019-12-12 21:22:48 阅读数 55 收藏
文章目录
Redis介绍
1.Redis和Memcached类似,也属于key-value数据存储的NoSQL,支持更多value类型,除了和string外,还支持hash(哈希)、list(链表)、set(集合)和sorted set(有序集合)
3.Memcached只能将数据存储在内存中,而Redis可以将数据存储在硬盘中,这就是Redis持久化
2.Redis持久化使用了两种文件格式:全量数据(RDB)和增量请求(aof),全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载,增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog
3.Redis的存储分为内存存储、磁盘存储和log文件三部分
Redis安装
下载:
[root@linux src]# cd /usr/local/src/
[root@linux src]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
- 1
- 2
解压:
[root@linux src]# tar -zxvf redis-5.0.7.tar.gz
- 1
编译安装:
[root@linux src]# cd redis-5.0.7/
[root@linux redis-5.0.7]# make && make install
- 1
- 2
拷贝配置文件到/etc下:
[root@linux redis-5.0.7]# cp redis.conf /etc/
- 1
编辑配置文件:
[root@linux redis-5.0.7]# vim /etc/redis.conf
- 1
定义以下配置项的值:
#定义启动方式为后台启动
daemonize yes
#定义日志存储目录
logfile "/var/log/redis.log"
#定义数据存放目录
dir /data/redis_data
#开启aof日志
appendonly yes
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
创建数据存放目录:
[root@linux ~]# mkdir /data/redis_data
- 1
启动Redis:
[root@linux ~]# redis-server /etc/redis.conf
[root@linux ~]# ps -aux |grep redis
root 51559 0.2 0.2 153896 2312 ? Ssl 14:03 0:00 redis-server 127.0.0.1:6379
- 1
- 2
- 3
查看日志:
[root@linux ~]# less /var/log/redis.log
- 1
根据两条警告信息更改内核参数:
[root@linux ~]# sysctl vm.overcommit_memory=1
[root@linux ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
- 1
- 2
#此时再重启redis就不会再提示警告信息了,将两条命令添加到/etc/rc.local文件中,重启服务器后会自动执行
Redis持久化
1.Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
2.RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘上
3.AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
4.RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高
5.如果没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,所有数据就像memcached一样存储在内存中
RDB模式配置参数在redis.conf配置文件中:
1.以上3行分别表示900秒产生1次数据变更,300秒产生10次数据变更,60秒产生10000次数据变更,只要满足任意一个条件数据就会被存储到磁盘
2.如需关闭RDB模式,注释掉这3行,将第一行save " "的注释去掉即可
AOF模式配置参数:
appendonly yes #开启aof模式,关闭改为no
appendfilename "appendonly.aof" #记录文件名称
#三种数据写入磁盘的方式,通常用第二种
# appendfsync always #每次变更将数据写入磁盘
appendfsync everysec #每秒将数据写入磁盘
# appendfsync no #系统将内存中的数据写入磁盘时,才将redis数据写入磁盘
- 1
- 2
- 3
- 4
- 5
- 6
开启相应的模式后,重启redis就会在配置文件中定义的数据存放目录下生成.rdb或.aof文件
Redis数据类型和常用操作
Redis有5中数据类型,分别是string(字符串)、list(链表)、set(集合)、sorted set(有序集合)、hash(哈希)
string为最简单的类型,与Memcached一样,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富
连接redis:
[root@linux ~]# redis-cli
127.0.0.1:6379>
- 1
- 2
set命令:增加一个key
127.0.0.1:6379> set test 123
OK
- 1
- 2
#key为test,value为123
get命令:获取key的值
127.0.0.1:6379> get test
"123"
- 1
- 2
mset命令:增加多个key
127.0.0.1:6379> MSET key1 a key2 b key3 c
OK
- 1
- 2
mget命令:获取多个key的value
127.0.0.1:6379> MGET key1 key2 key3
1) "a"
2) "b"
3) "c"
- 1
- 2
- 3
- 4
#redis命令行中支持tab键补全,使用tab键补全的命令,显示为大写
set增加的key存在时,value会直接被覆盖:
127.0.0.1:6379> set key1 abc
OK
127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> get key1
"123"
- 1
- 2
- 3
- 4
- 5
- 6
setnx命令:
#当键存在时,返回0并且不覆盖value
127.0.0.1:6379> set key1 a
OK
127.0.0.1:6379> SETNX key1 aaa
(integer) 0
127.0.0.1:6379> get key1
"a"
#当键不存在时,返回1并且创建
127.0.0.1:6379> SETNX key0 aaa
(integer) 1
127.0.0.1:6379> get key0
"aaa"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
setex命令:定义数据过期时间
#键名为key0,value为aaa,数据过期时间60秒
127.0.0.1:6379> SETEX key0 60 aaa
OK
#定义数据过期时间的第二种方式
127.0.0.1:6379> set key0 aaa ex 60
OK
- 1
- 2
- 3
- 4
- 5
- 6
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等,操作中key理解为链表的名字,使用 list 结构,可以实现最新消息排行等功能,list 的另一个应用就是消息队列,可以利用 list 的 push操作,将数据存入 list 中,然后工作线程再用pop操作将数据取出进行执行
lpush命令:从左侧加入元素
127.0.0.1:6379> LPUSH list1 abc
(integer) 1
127.0.0.1:6379> LPUSH list1 aaa
(integer) 2
127.0.0.1:6379> LPUSH list1 bbb
(integer) 3
- 1
- 2
- 3
- 4
- 5
- 6
lrange命令:获取链表的值
127.0.0.1:6379> LRANGE list1 0 1
1) "bbb"
2) "aaa"
127.0.0.1:6379> LRANGE list1 0 -1
1) "bbb"
2) "aaa"
3) "abc"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
#0 1 表示取第一第二个数据,0 -1表示取第一个到最后一个数据,数据排序按插入时间倒序
rpush命令:从右侧加入元素
127.0.0.1:6379> RPUSH list2 a
(integer) 1
127.0.0.1:6379> RPUSH list2 b
(integer) 2
127.0.0.1:6379> RPUSH list2 c
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
1) "a"
2) "b"
3) "c"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
#数据按插入时间正序排序
lpop命令:从最前面取出元素
127.0.0.1:6379> LPOP list1
"bbb"
127.0.0.1:6379> LRANGE list1 0 -1
1) "aaa"
2) "abc"
- 1
- 2
- 3
- 4
- 5
#数据被取出后,链表中就不存在了,优先取排序在最前面的数据
rpop命令:从最后面取出元素
127.0.0.1:6379> RPOP list2
"c"
127.0.0.1:6379> LRANGE list2 0 -1
1) "a"
2) "b"
- 1
- 2
- 3
- 4
- 5
#优先取排序在最后面的数据
linsert……before命令:在某个元素的前面插入一个元素
#插入元素c,排在了元素b之后
127.0.0.1:6379> RPUSH list2 c
(integer) 3
127.0.0.1:6379> LRANGE list2 0 -1
1) "a"
2) "b"
3) "c"
#在元素b之前插入一个元素
127.0.0.1:6379> LINSERT list2 before b 123
(integer) 4
127.0.0.1:6379> LRANGE list2 0 -1
1) "a"
2) "123"
3) "b"
4) "c"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
lset命令:通过索引修改元素
#将第二个元素修改为z
127.0.0.1:6379> LSET list2 1 z
OK
127.0.0.1:6379> LRANGE list2 0 -1
1) "a"
2) "z"
3) "b"
4) "c"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
lindex命令:通过索引获取元素
#获取第一个元素
127.0.0.1:6379> LINDEX list2 0
"a"
#获取第四个元素
127.0.0.1:6379> LINDEX list2 3
"c"
- 1
- 2
- 3
- 4
- 5
- 6
llen命令:获取元素的数量
127.0.0.1:6379> LLEN list2
(integer) 4
- 1
- 2
set是集合,对集合的操作有添加删除元素,有对多个集合求交并差等操作,操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合,因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中
sadd命令:创建集合
127.0.0.1:6379> SADD set1 a
(integer) 1
127.0.0.1:6379> SADD set1 b
(integer) 1
127.0.0.1:6379> SADD set1 c
(integer) 1
127.0.0.1:6379> SADD set2 1
(integer) 1
127.0.0.1:6379> SADD set2 2
(integer) 1
127.0.0.1:6379> SADD set2 a
(integer) 1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
#集合set1包含的元素:a、b、c,集合set2包含的元素1、2、a
创建集合的第二种方式:
127.0.0.1:6379> SADD set3 a b c d 1 2 3
(integer) 6
- 1
- 2
smembers命令:获取集合中的元素
127.0.0.1:6379> SMEMBERS set1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> SMEMBERS set2
1) "2"
2) "1"
3) "a"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
sunion命令:求并集
127.0.0.1:6379> SUNION set1 set2
1) "a"
2) "c"
3) "b"
4) "1"
5) "2"
- 1
- 2
- 3
- 4
- 5
- 6
#将两个集合的元素合并,并对重复的元素去重
sunionstore命令:存储并集结果
#将并集结果存储到set3
127.0.0.1:6379> SUNIONSTORE set3 set1 set2
(integer) 5
127.0.0.1:6379> SMEMBERS set3
1) "a"
2) "c"
3) "b"
4) "1"
5) "2"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
sinter命令:求交集
127.0.0.1:6379> SINTER set1 set2
1) "a"
- 1
- 2
#取两个集合中相同的元素
sinterstore命令:存储交集的结果
#将交集结果存储到set3
127.0.0.1:6379> SINTERSTORE set3 set1 set2
(integer) 1
127.0.0.1:6379> SMEMBERS set3
1) "a"
- 1
- 2
- 3
- 4
- 5
sdiff命令:求差集
127.0.0.1:6379> SDIFF set1 set2
1) "b"
2) "c"
- 1
- 2
- 3
sdiffstore命令:存储差集的结果
#将差集结果存储到set3
127.0.0.1:6379> SDIFFSTORE set3 set1 set2
(integer) 2
127.0.0.1:6379> SMEMBERS set3
1) "b"
2) "c"
- 1
- 2
- 3
- 4
- 5
- 6
#取属于set1且不属于set2的元素
srem命令:删除元素
127.0.0.1:6379> SREM set1 c
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "b"
2) "a"
- 1
- 2
- 3
- 4
- 5
spop命令:随机取出一个元素并删除
127.0.0.1:6379> SPOP set1
"a"
127.0.0.1:6379> SMEMBERS set1
1) "b"
- 1
- 2
- 3
- 4
srandmember命令:随机取出一个元素但不删除
127.0.0.1:6379> SRANDMEMBER set1
"b"
127.0.0.1:6379> SMEMBERS set1
1) "b"
- 1
- 2
- 3
- 4
sorted set是有序集合,它比set多了一个权重参数score(分值),使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的sorted sets,其集合 value 可以是学生姓名,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了排序
zadd命令:创建有序集合
127.0.0.1:6379> ZADD sset 50 a
(integer) 1
127.0.0.1:6379> ZADD sset 30 b
(integer) 1
127.0.0.1:6379> ZADD sset 90 c
(integer) 1
- 1
- 2
- 3
- 4
- 5
- 6
#50、30、90就是权重参数
zrange命令:获取集合的元素
127.0.0.1:6379> ZRANGE sset 0 -1
1) "b"
2) "a"
3) "c"
- 1
- 2
- 3
- 4
#根据权重数值从小到大排序
withscores参数:获取元素以及分值
127.0.0.1:6379> ZRANGE sset 0 -1 withscores
1) "b"
2) "30"
3) "a"
4) "50"
5) "c"
6) "90"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
#奇数行为元素,偶数行为分值
zrevrange命令:倒序获取集合的元素
127.0.0.1:6379> ZREVRANGE sset 0 -1
1) "c"
2) "a"
3) "b"
- 1
- 2
- 3
- 4
#根据权重数值从大到小排序
zrank命令:获取元素的下标,根据score正向排序
127.0.0.1:6379> ZRANK sset c
(integer) 2
- 1
- 2
zrevrank命令:获取元素的下标,根据score反向排序
127.0.0.1:6379> ZREVRANK sset c
(integer) 0
- 1
- 2
zcard命令:获取元素的数量
127.0.0.1:6379> ZCARD sset
(integer) 3
- 1
- 2
zrangebyscore命令:获取某个分值范围的元素
127.0.0.1:6379> ZRANGEBYSCORE sset 10 50
1) "b"
2) "a"
- 1
- 2
- 3
zcount命令:获取某个分值范围的元素个数
127.0.0.1:6379> ZCOUNT sset 10 50
(integer) 2
- 1
- 2
zrem命令:删除指定元素
127.0.0.1:6379> ZREM sset b
(integer) 1
127.0.0.1:6379> ZRANGE sset 0 -1
1) "a"
2) "c"
- 1
- 2
- 3
- 4
- 5
zremrangebyrank命令:删除指定下标范围内的元素
127.0.0.1:6379> ZRANGE sset 0 -1
1) "b"
2) "a"
3) "c"
#删除下标0到1范围的元素
127.0.0.1:6379> ZREMRANGEBYRANK sset 0 1
(integer) 2
127.0.0.1:6379> ZRANGE sset 0 -1
1) "c"
zremrangebyscore命令:删除指定分值范围内的元素
127.0.0.1:6379> ZRANGE sset 0 -1 withscores
1) "b"
2) "30"
3) "a"
4) "50"
5) "c"
6) "90"
#删除分值10到50范围的元素
127.0.0.1:6379> ZREMRANGEBYSCORE sset 10 50
(integer) 2
127.0.0.1:6379> ZRANGE sset 0 -1 withscores
1) "c"
2) "90"
hash可以理解为多个string的集合,在Memcached中,经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的姓名、年龄、性别
hset命令:创建hash
127.0.0.1:6379> hset hash1 name zhangsan
(integer) 1
127.0.0.1:6379> hset hash1 age 18
(integer) 1
127.0.0.1:6379> hset hash1 sex male
(integer) 1
hget命令:获取指定键的值
127.0.0.1:6379> HGET hash1 name
"zhangsan"
hgetall命令:获取hash的所有键值
127.0.0.1:6379> HGETALL hash1
1) "name"
2) "zhangsan"
3) "age"
4) "18"
5) "sex"
6) "male"
#奇数行为key,偶数行为value
hmset命令:批量添加键值对
127.0.0.1:6379> HMSET hash2 a 1 b 2 c 3
OK
hmget命令:获取多个键的值
127.0.0.1:6379> HMGET hash2 a b c
1) "1"
2) "2"
3) "3"
hkeys命令:获取所有键
127.0.0.1:6379> HKEYS hash2
1) "a"
2) "b"
3) "c"
hvals命令:获取所有值
127.0.0.1:6379> HVALS hash2
1) "1"
2) "2"
3) "3"
hlen命令:获取键的数量
127.0.0.1:6379> HLEN hash2
(integer) 3
hdel命令:删除指定的键
127.0.0.1:6379> HDEL hash2 a
(integer) 1
127.0.0.1:6379> HGETALL hash2
1) "b"
2) "2"
3) "c"
4) "3"
Redis键值和服务的常用操作
keys * 获取所有key
keys has* 模糊匹配key
exists keyname 查看key是否存在,存在返回1,不存在返回0
del keyname 删除指定key,成功返回1,否则返回0
expire keyname 60 设置key过期时间为60s
ttl keyname 查询key还有多久过期,单位秒,已过期或key不存在时,返回-2,未设置过期时间的key,返回-1
persist keyname 取消key的过期时间
select 1 选择数据库1(redis默认有16个数据库,分别为0-15),默认进入0库
move keyname 1 将key移动到1数据库
randomkey 随机获取一个key
rename oldkey newkey 重命名key
type keyname 获取key的数据类型
dbsize 获取当前数据库中key的数量
info 获取redis状态信息
flushdb 清空当前数据库中所有的key
flushall 清空所有数据库中所有的key
bgsave 保存内存中的数据到.rdb文件,在后台运行
save 作用同上,在前台运行
config get * 获取所有配置参数
config get timeout 获取指定配置参数
config set timeout 100 修改指定配置参数的值
redis数据恢复:将.rdb文件放到配置参数dir定义的目录下,重启服务即可恢复数据
Redis安全设置
1.在配置文件中设置监听ip:bind 127.0.0.1 1.1.1.1 (多个IP用空格分开)
2.更改默认端口6379
3.设置redis密码,在配置文件中添加:requirepass testpassword,登录时使用-a参数指定密码:redis-cli -a testpassword (密码包含特殊字符时使用单引号括起来)
4.将config命令改名,在配置文件中添加:rename-command CONFIG mycf,连接redis后使用mycf即可实现config命令效果
5. 禁掉config命令,在配置文件中添加:rename-command CONFIG “”