1、redis和memcache类似,也属于k-v存储;
支持的value类型,有string(字符串)、list(列表)、hash(哈希)、set(集合)、有序集合;
redis使用了两种文件格式:全量数据(RDB)和增量请求(aof), 持久化;
全量数据相当于把key和value都写入到磁盘里去;以便下次读取时加载;
增量请求相当于mysql的binlog,每一次的请求会创建相应的key-value值;
redis存储:内存存储、磁盘存储、log文件三部分;
redis安装:
下载: wget http://download.redis.io/releases/redis-4.0.1.tar.gz
解压: tar zxvf redis-4.0.1.tar.gz
make及make install:
[root@localhost_001 src]# cd redis-4.0.1
[root@localhost_001 redis-4.0.1]# make && make install拷贝配置文件:
cp redis.conf /etc/redis.conf
安装代码:
[root@localhost_001 src]# wget http://download.redis.io/releases/redis-4.0.1.tar.gz[root@localhost_001 src]# tar zxvf redis-4.0.1.tar.gz[root@localhost_001 src]# cd redis-4.0.1[root@localhost_001 redis-4.0.1]# make && make install[root@localhost_001 redis-4.0.1]# cp redis.conf /etc/redis.conf
修改redis的配置文件: /etc/redis.conf
[root@localhost_001 redis-4.0.1]# vim /etc/redis.confbind 127.0.0.1 #表示监听的端口;protected-mode yes #保护模式打开;port 6379 #监听端口;daemonize yes #表示在前台启动,默认是 no ,在后台启动;logfile "/var/log/redis.log" #定义日记文件所在的位置;database 16 #表示redis 默认在0库,总共是16个库;(0-15) save 900 1save 300 10save 60 10000 #表示设置持久化;dir /data/redis_data #设置存放adb aof的路径;appendonly yes #用来开启aof 的日记;开启后会在/data/redis_data下生成“appendonly.aof”文件;appendfsync alway #实时更新记录;appendfsync everysec #每秒记录一次日记;appendfsync no #不记录;
2、创建redis存放adb aof的目录;
[root@localhost_001 redis-4.0.1]# mkdir /data/redis_data
3、启动redis; redis-server /etc/redis.conf
[root@localhost_001 redis-4.0.1]# redis-server /etc/redis.conf [root@localhost_001 redis-4.0.1]# ps aux |grep redisroot 5062 1.2 0.3 145296 7520 ? Ssl 22:33 0:00 redis-server 127.0.0.1:6379root 5067 0.0 0.0 112720 972 pts/0 R+ 22:33 0:00 grep --color=auto redis[root@localhost_001 redis-4.0.1]# netstat -lnp|grep redistcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5062/redis-server 1
注释:可以查看它的监听端口6739;
4、查看它的日记文件: less /var/log/redis.log
5062:M 07 Mar 22:33:12.786 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
5062:M 07 Mar 22:33:12.786 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.注释:如上所示:内存设置为 0, 在内存不足的时,会出现无法保存等问题, THP会导致redis延迟和内存问题;
[root@localhost_001 redis-4.0.1]# sysctl vm.overcommit_memory=1vm.overcommit_memory = 1[root@localhost_001 redis-4.0.1]# echo never >/sys/kernel/mm/transparent_hugepage/enabled [root@localhost_001 redis-4.0.1]# cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never]
5、再次重新启动即可: redis-server /etc/redis.conf
[root@localhost_001 redis-4.0.1]# redis-server /etc/redis.conf
6、redis持久化: RDB(redis database) AOF(append only file)
redis提供了两种持久化的方式: RDB全量数据 和 AOF增量请求
RDB:就是在不同的时间段,将redis存储的数据生成快照并存储在磁盘等介质上;
AOF:把 redis 执行过的写操作指令都记录下来,在下次重启redis时,只要把这些写操作从头到尾再执行一遍,即可恢复数据;------> 相当于 mysql的binlog日记
并且 RDB 和 AOF 可以同时使用,在这种情况下,如果redis 重启的话,则优先使用 AOF 来进行恢复,因为 AOF 方式数据恢复完整度最高;
如果没有数据持久化需求,也可以关闭 RDB全量数据和AOF增量请求,这样的话,则redis变成了一个纯内存的数据库,就像memcache一样;
持久化相关参数: save 秒 改变的key值
[root@localhost_001 ~]# vim /etc/redis.conf# save "" #如果把这行打开,则表示禁用RDB持久化; save 900 1 #表示每十五分钟且至少有一个key值发生改变,就触发一次持久化;save 300 10 #表示每五分钟且至少有十个key值发生改变,就触发一次持久化;save 60 10000 #表示每60秒且至少有1万个key值发生改变,就触发一次持久化;appendonly yes #如果是yes,则表示开启持久化 AOF;appendfilename "appendonly.aof" #指定持久化文件名称;#下面参数表示指定fsync()调用模式:# appendfsync always #每次写都调用fsync; 这种方式最快;appendfsync everysec #每秒钟调用一次; 这种方式最安全;性能差一些;# appendfsync no #不调用; 默认是这种方式;
注释如下:
[root@localhost_001 ~]# vim /etc/redis.conf
# save "" #如果把这行打开,则表示禁用RDB持久化; save 900 1 #表示每十五分钟且至少有一个key值发生改变,就触发一次持久化; save 300 10 #表示每五分钟且至少有十个key值发生改变,就触发一次持久化; save 60 10000 #表示每60秒且至少有1万个key值发生改变,就触发一次持久化;appendonly yes #如果是yes,则表示开启持久化 AOF;
appendfilename "appendonly.aof" #指定持久化文件名称;
#下面参数表示指定fsync()调用模式: # appendfsync always #每次写都调用fsync; 这种方式最快; appendfsync everysec #每秒钟调用一次; 这种方式最安全;性能差一些; # appendfsync no #不调用; 默认是这种方式;7、redis的数据类型: string 字符串 list 列表 hash 哈希 set 集合 有序集合 5种redis-cli 进入 redis 的命令行
字符串类型: string 一个 key 值对应一个 value 可以存二进制对象 操作与memcache类似;
设置值:set key value 获取值: get mykey
[root@localhost_001 redis_data]# redis-cli127.0.0.1:6379> set mykey yuanhh OK127.0.0.1:6379> get mykey"yuanhh"
同时还可以设置多个键值对; mset key1 yuanhh key2 pan key zhang
127.0.0.1:6379> mset key1 yuanhh key2 pan key3 zhangOK127.0.0.1:6379> mget key1 key2 key31) "yuanhh"2) "pan"3) "zhang"
8、redis数据类型 列表 list 一个链表结构,主要功能是 push(推) pop(拉),获取一个范围内的所有值, key 可以理解为链表的名字;
list的应用可以用在消息队列,可以利用list的push操作,将任务存在list中,然后工作线程在用pop操作将任务取出来执行;
操作: 推 lpush list1 "yuanhh"
查看 lrange list start(开始) stop(结束) lrange list 0 -1(-1表示末尾的一个)
取: lpop list1 注释:取出来后再查看就没有这个值了;
127.0.0.1:6379> lpush list1 "yaunhh"(integer) 1127.0.0.1:6379> lpush list1 "pan"(integer) 2127.0.0.1:6379> lpush list1 "zhang"(integer) 3127.0.0.1:6379> lrange list1 0 11) "zhang"2) "pan"127.0.0.1:6379> lrange list1 0 -11) "zhang"2) "pan"3) "yaunhh"取:lpop127.0.0.1:6379> lpop list1"zhang"127.0.0.1:6379> lrange list1 0 -11) "pan"2) "yaunhh"
注释:如上发现,最先推进去排最后一位;
9、redis 数据类型:set 集合 对集合操作: 增加删除集合 对集合求交集 并集 差集 key表示集合的名字;
如在微博应用中,可以将一个用户的所有关注的人放在一个集合中,将其所有的粉丝放到一个集合,这样可以更具交集 并集 差集 可以很方便的实现共同关注,共同喜好等功能;然后对操作还可以选择返回给客户端还是存到一个新的集合中;
添加集合: sadd set1 a
查看集合:smembers set1
删除集合:srem set1 a
并集: sunion set1 set2 表示把这两个集合 合并到一起;
交集: sinter set1 set2 表示这两个集合相同的部分;
差集: sdiff set1 set2 表示 set1有; set2 里没有的;
127.0.0.1:6379> sadd set1 a (integer) 1127.0.0.1:6379> sadd set1 b(integer) 1127.0.0.1:6379> sadd set1 c(integer) 1127.0.0.1:6379> smembers set11) "c"2) "a"3) "b"127.0.0.1:6379> sadd set2 a(integer) 1127.0.0.1:6379> sadd set2 2(integer) 1127.0.0.1:6379> sadd set2 3(integer) 1127.0.0.1:6379> sadd set2 c(integer) 1127.0.0.1:6379> smembers set2 #查看集合;1) "c"2) "a"3) "3"4) "2"127.0.0.1:6379> smembers set11) "c"2) "a"3) "b"127.0.0.1:6379> sunion set1 set2 #求并集;1) "a"2) "c"3) "3"4) "b"5) "2"127.0.0.1:6379> sinter set1 set2 #求交集;1) "c"2) "a"127.0.0.1:6379> sdiff set1 set2 #求差集;1) "b"127.0.0.1:6379> sdiff set2 set11) "2"2) "3"
10、redis数据类型- sort set 有序集合; 它比set 多了一个权重 score,使的集合中的元素按照 score 来排序;
比如存储一个全班同学的成绩,其集合value 是学号, 而score就是其考试得分,这样数据在插入结合时,就已经进行了排序;
增加: zadd key score(分数) value(学号) zadd set3 12 yuanhh
正序查看: zrange key 0 -1 zrange set3 0 -1
倒序查看: zrevrange key 0 -1 zrevrange set3 0 -1
127.0.0.1:6379> zadd set3 12 yuanhh(integer) 1127.0.0.1:6379> zadd set3 2 "cde 123"(integer) 1127.0.0.1:6379> zadd set3 24 zhang(integer) 1127.0.0.1:6379> zadd set3 4 pan(integer) 1127.0.0.1:6379> zrange set3 0 -1 #正序查看;1) "cde 123"2) "pan"3) "yuanhh"4) "zhang"127.0.0.1:6379> zrevrange set3 0 -1 #倒序查看;1) "zhang"2) "yuanhh"3) "pan"4) "cde 123"
11、redis数据类型- hash 在memcache中,将一些结构化的信息打包成hashmap,在和客户端序列化后存储为一个字符串的值(JSON)格式,比如用户的昵称、年龄、性别、积分等;
添加: hset hash1 name yuanh
查看: hget hash1 name
查看一个hash集合: hgetall hash1
127.0.0.1:6379> hset hash1 name yuanhh(integer) 1127.0.0.1:6379> hset hash1 age 25(integer) 1127.0.0.1:6379> hset hash1 job it(integer) 1127.0.0.1:6379> hget hash1 name"yuanhh"127.0.0.1:6379> hget hash1 age"25"127.0.0.1:6379> hget hash1 job"it"127.0.0.1:6379> hgetall hash11) "name"2) "yuanhh"3) "age"4) "25"5) "job"6) "it"
12、redis数据类型操作: sting 的常用操作
set key1 value 设置一个string类型;(如果本来已经设置了key1值,第二次在赋值会被覆盖;)
setnx key1 value 如果这个key1已经存在则返回 0 ; 如果不存在,则创建则直接创建 key1;
setex key3 过期时间 value 创建值并设置过期时间(如果value值存在则覆盖) ==== setex key3 10 aaa == set key3 aaa ex 10
mset key1 aaa key2 bbb key3 ccc 设置多个key -value
mget key1 key2 key3 通过key值来查看value
127.0.0.1:6379> set key2 linux #设置 key2 的值;OK127.0.0.1:6379> set key1 python #设置 key2 的值;OK127.0.0.1:6379> get key1 #查看 key1 的值;"python"127.0.0.1:6379> setnx key1 aaa #设置key1的值为aaa,因为已经存在,所有返回值时 0 ;(integer) 0127.0.0.1:6379> setnx key4 aaa #设置key4的值为aaa,因为不存在,所有返回值1,并且会创建这个值 ;(integer) 1127.0.0.1:6379> get key4 #查看 key4 这个值;"aaa"127.0.0.1:6379> set key3 aaa ex 10 #覆盖key3为 aaa,并设置过期时间 10ms;OK127.0.0.1:6379> get key3 #过10ms后查看,发现值为空;(nil)127.0.0.1:6379> setex key3 10 bbb #这个方法也是设置过期时间,同上命令;OK127.0.0.1:6379> mset key1 a key2 b key3 cOK127.0.0.1:6379> mget key1 key2 key31) "a"2) "b"3) "c"
13、redis数据类型操作: list 的常用操作:
lpush list2 aaa 添加一个元素
lrange list2 0 -1 查看添加的元素
lpop list2 会把最上面的元素取走,list就相当于是一个瓶子里,取东西会从最上面来取;
rpop list2 同上面刚好相反,取东西会从最下面开始取,即是从瓶子的下面开始取;
linsert list2 before 元素1 元素2 表示在元素1前面插入元素2;
linsert list2 after 元素1 元素2 表示在元素1后面插入元素2;
lset list2 2 ccc 表示把列表里第二个元素修改为 ccc;
lindex list2 0 查看第一个元素;
lindex list2 3 查看第四个元素;
llen list2 查看列表中总共有几个元素;
127.0.0.1:6379> lpush list2 aaa #给列表list2增加元素 aaa(integer) 1127.0.0.1:6379> lpush list2 bbb #给列表list2增加元素 bbb(integer) 2127.0.0.1:6379> lrange list2 0 -1 #查看list2 这个元素列表1) "bbb"2) "aaa"127.0.0.1:6379> lpop list2 #从最下面开始取出元素"bbb"127.0.0.1:6379> rpop list2 #从最上面开始取出元素"aaa"127.0.0.1:6379> lrange list2 0 -1 #查看这个元素列表1) "ddd" 2) "ccc"127.0.0.1:6379> LINSERT list2 before ccc aaa #表示在元素 ccc 之前插入 aaa(integer) 3127.0.0.1:6379> lrange list2 0 -11) "ddd"2) "aaa"3) "ccc"127.0.0.1:6379> LINSERT list2 after ccc ddd #表示在元素 ccc 之后插入 ddd(integer) 4127.0.0.1:6379> lrange list2 0 -11) "ddd"2) "aaa"3) "ccc"4) "ddd"
14、redis数据类型操作: set 的常用操作
sadd seta aaa #给集合 seta 添加元素 aaa
smembers seta #查看集合中所有的元素
srem seta aaa #删除这个元素
spop seta 随机取出一个元素,并删除
sdiff seta setb #求差集; 以seta为标准,列出seta里面有,setb里面没有的值;
sdiffstore setc seta setb #求出它们的差集,并写入到新集合 setc 里面;
sinter seta setb #求交集;
sunion seta setb #求并集;
simmember seta aaa #判断 aaa 这个元素是否在seta这个集合,在则返回1 ,不在则返回0;
srandmember seta #随机取出一个元素,但不会删除;
127.0.0.1:6379> sadd seta aaa #给集合seta 添加一个元素 aaa(integer) 127.0.0.1:6379> sadd seta bbb #给集合seta 添加一个元素 bbb(integer) 1127.0.0.1:6379> smembers seta #查看这个集合 seta1) "aaa"2) "bbb"127.0.0.1:6379> srem seta aaa #删除这个集合 seta里面的元素 aaa(integer) 1127.0.0.1:6379> spop seta #随机删除集合seta里面的一个元素"bbb"127.0.0.1:6379> sadd seta aaa(integer) 1127.0.0.1:6379> sadd seta bbb(integer) 1127.0.0.1:6379> sadd seta 111(integer) 1127.0.0.1:6379> sadd setb 222(integer) 1127.0.0.1:6379> sadd setb 111(integer) 1127.0.0.1:6379> SMEMBERS seta1) "111"2) "aaa"3) "bbb"127.0.0.1:6379> SMEMBERS setb1) "111"2) "222"127.0.0.1:6379> sdiff seta setb #以seta为标准,求差集;(列表seta有的,而setb没有的)1) "aaa"2) "bbb"127.0.0.1:6379> sdiff setb seta #以setb为标准,求差集;(列表setb有的,而seta没有的)1) "222"127.0.0.1:6379> sdiffstore setc seta setb #求差集并把结果写入到setc这个集合里(integer) 3127.0.0.1:6379> sinter seta setb #求交集1) "111"127.0.0.1:6379> sunion seta setb #求并集,全部列出1) "aaa"2) "bbb"3) "ccc"4) "222"5) "111"127.0.0.1:6379> SISMEMBER seta aaa #判断 aaa这个元素是否在seta这个集合里,在则返回1(integer) 1127.0.0.1:6379> SISMEMBER seta ddd #判断 bbb这个元素是否在seta这个集合里,不在则返回0(integer) 0127.0.0.1:6379> SRANDMEMBER seta #随机取出一个字符,但不删除"aaa"127.0.0.1:6379> SRANDMEMBER seta 2 #随机取出两个字符,但不删除1) "aaa"2) "bbb"
15、redis数据类型操作: sort set 有序集合的常用操作
zadd zseta 11 yuanhh 创建有序集合 zadd 集合名 分数 值
zrange zseta 0 -1 查看这个集合的内容
zrem zseta yuanh 删除指定的元素
zrank zseta yuanhh 返回元素的索引值,也就是说是在第几位
zevrank zseta yuanhh 同上,也是返回索引值,不会是倒序显示
zrevrange zseta 0 -1 返回所有元素,并分值
zcard zseta 返回集合中所有元素的个数
zconut zseta 0 20 返回分值在0-20之间的元素个数
zrangebyscore zseta 1 10 返回分值在1-10之间的元素个数
zremrangebyrank zset 1 10 删除索引范围 1 - 10 的元素
zremrangebyscore zset 1 10 删除分值范围1 - 10的元素
127.0.0.1:6379> zadd zseta 11 yuanhh #添加一个有序集合zseta,分数是11 学号是yuanhh(integer) 1127.0.0.1:6379> zadd zseta 12 pan(integer) 1127.0.0.1:6379> zrange zseta 0 -1 #查看这个有序集合1) "yuanhh"2) "pan"127.0.0.1:6379> zrem zseta pan #删除集合里的元素(integer) 1127.0.0.1:6379> zrange zseta 0 -11) "yuanhh"127.0.0.1:6379> zadd zseta 11 yuanhh (integer) 0127.0.0.1:6379> zadd zseta 18 ding(integer) 1127.0.0.1:6379> zadd zseta 128 zhang(integer) 1127.0.0.1:6379> zadd zseta 4 xiaoxiao(integer) 1127.0.0.1:6379> zadd zseta 24 xxx(integer) 1127.0.0.1:6379> zrange zseta 0 -11) "xiaoxiao"2) "yuanhh"3) "ding"4) "xxx"5) "zhang"127.0.0.1:6379> zrank zseta ding #查看ding这个元素的索引值; 正序(integer) 2127.0.0.1:6379> zrevrank zseta ding #查看ding这个元素的索引值; 倒序(integer) 2127.0.0.1:6379> zrevrange zseta 0 -11) "zhang"2) "xxx"3) "ding"4) "yuanhh"5) "xiaoxiao"127.0.0.1:6379> zcard zseta #查看这个有序集合的个数(integer) 5127.0.0.1:6379> zcount zseta 1 20 #查看分值在1 - 20的个元素个数(integer) 3127.0.0.1:6379> zrangebyscore zseta 1 20 #查看分值在1 - 20的元素1) "xiaoxiao"2) "yuanhh"3) "ding"127.0.0.1:6379> zremrangebyrank zseta 0 2 #删除索引是 0 - 2 的元素(integer) 3127.0.0.1:6379> zremrangebyscore zseta 1 30 #删除分值是 1 - 30的元素(integer) 1
16、redis数据类型操作: hash 的常用操作
hset user1 name yuanh 创建 hset 名称 key value
hmset hash2 name pan age 26 job py 批量创建键值对
hgetall user1 #查看user1下的key-value
hmget user1 name age #批量查看user的key值时name和value的value
hdel user1 job #删除user1下key值为job的
hkyes user1 #批量显示键值
hvls user1 #批量显示value值
127.0.0.1:6379> hset user1 name yuanhh #创建user1的key - value(integer) 1127.0.0.1:6379> hset user1 age 25(integer) 1127.0.0.1:6379> hset user1 job it(integer) 1127.0.0.1:6379> hmset hash2 a 1 b 2 c 3 d 4 #批量创建键值对OK127.0.0.1:6379> hgetall user1 #查看键值对1) "name"2) "yuanhh"3) "age"4) "25"5) "job"6) "it"127.0.0.1:6379> hmget user1 name age #查看user1下key是name和age的1) "yuanhh"2) "25"127.0.0.1:6379> hdel user1 job #删除user1下key是job的key-value(integer) 1127.0.0.1:6379> hkeys user1 #批量查看keys值1) "name"2) "age"127.0.0.1:6379> hvals user1 #批量查看value值1) "yuanhh"2) "25"127.0.0.1:6379> hlen user1 #查看user1de 键值对的个数(integer) 2