redis介绍, redis安装, redis持久化, redis数据类型

  • 时间:
  • 来源:互联网

redis介绍

  • Redis和Memcached类似,也属于k-v数据存储
  • Redis官网redis.io, 当前最新稳定版4.0.1 支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)
  • redis使用了两种文件格式:全量数据(RDB)和增量请求(aof)。
    全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。
    增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,这种类似于mysql binlog。
  • redis的存储分为内存存储、磁盘存储和log文件三部分

redis安装

  • 安装
[root@draft src]# wget http://download.redis.io/releases/redis-4.0.1.tar.gz -c
[root@draft src]#  tar zxf redis-4.0.1.tar.gz 
[root@draft src]# mv redis-4.0.1 redis4
[root@draft src]# cd redis4
[root@draft redis4]# make && make install  #不用configure;
  • 默认配置文件和修改项目;
bind 127.0.0.1    #监听的IP;
protected-mode yes   #保护模式;
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no      #要改成yes;后台运行;
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice    #日志等级;
logfile ""      #创建目录,如 "/var/log/redis.log"
databases 16    #默认有0-16个数据库;
always-show-logo yes
save 900 1     #保存在DB的规则;
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes   #错误时停止写;
rdbcompression yes		#压缩;
rdbchecksum yes		
dbfilename dump.rdb    #储存文件名;
dir ./	  #路径,设置成 /data/redis
slave-serve-stale-data yes    #从机与主机断开时,继续应答请求;
slave-read-only yes     #主读,防止从机被写入;
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100   #从机优先级;
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no    #改成yes开启aof;
appendfilename "appendonly.aof"   #文件名;
appendfsync everysec    #每秒同步一次;
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
  • 启动redis
[root@draft redis4]# mkdir -p /data/redis
[root@draft redis4]# cp redis.conf /etc/redis.conf   #把修改后的配置文件,放到/etc里;
[root@draft redis4]# redis-server /etc/redis.conf     #启动
[root@draft redis4]# ps aux |grep redis
root      13866  0.3  0.2 145304  2092 ?        Ssl  13:47   0:00 redis-server 127.0.0.1:6379
root      13871  0.0  0.0 112728   972 pts/0    S+   13:48   0:00 grep --color=auto redis
[root@draft redis4]# netstat -lntp |grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      13866/redis-server
  • 启动后的日志
13866:M 12 Dec 13:47:53.832 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
13866:M 12 Dec 13:47:53.832 # Server initialized
13866:M 12 Dec 13:47:53.833 # 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.
13866:M 12 Dec 13:47:53.841 # 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.
13866:M 12 Dec 13:47:53.841 * Ready to accept connections
  • 处理以上两个警告
[root@draft redis4]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@draft redis4]# echo never > /sys/kernel/mm/transparent_hugepage/enabled 
[root@draft redis4]# tail -2 /etc/rc.local   #添加两个命令到rc.local里,开机运行;
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled

[root@draft redis4]# ls -la /data/redis/   #文件以root权限创建;
总用量 0
drwxr-xr-x. 2 root root 28 12月 12 13:47 .
drwxr-xr-x. 4 root root 32 12月 12 13:46 ..
-rw-r--r--. 1 root root  0 12月 12 13:47 appendonly.aof
[root@draft redis4]# ll /var/log/redis.log 
-rw-r--r--. 1 root root 2451 12月 12 13:47 /var/log/redis.log

Redis持久化

  • Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
  • RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。
  • AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
  • 其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
  • 如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。

Redis持久化相关参数

  • save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化
  • save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化
  • save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久
  • save “” #这样可以禁用rdb持久化
  • appendonly yes #如果是yes,则开启aof持久化
  • appendfilename “appendonly.aof” # 指定aof文件名字
  • appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为第三种。

Redis数据类型

  • string数据类型
    string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。
[root@draft redis4]# redis-cli 
127.0.0.1:6379> set k1 123
OK
127.0.0.1:6379> set k2 234
OK
127.0.0.1:6379> set k3 456
OK
127.0.0.1:6379> get k1
"123"
127.0.0.1:6379> get k2
"234"
127.0.0.1:6379> get k3
"456"
127.0.0.1:6379> MSET k1 12 k2 23 k3 34  #一次设置多个键;
OK
127.0.0.1:6379> MGET k1 k2 k3   #一次读取多个键;
1) "12"
2) "23"
3) "34"
  • list 数据类型
    list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。
    使用 list 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,然后工作线程再用pop操作将任务取出进行执行。
127.0.0.1:6379> LPUSH l1 1   #放进元素;
(integer) 1
127.0.0.1:6379> LPUSH l1 5
(integer) 2
127.0.0.1:6379> LPUSH l1 588
(integer) 3
127.0.0.1:6379> LRANGE l1 0 -1   #读取最新的到最后一个;先进后出;
1) "588"
2) "5"
3) "1"
127.0.0.1:6379> LRANGE l1 0 -2
1) "588"
2) "5"
127.0.0.1:6379> LPOP l1    #拿出最后个元素;
"588"
127.0.0.1:6379> LRANGE l1 0 -1  #拿出后消息;
1) "5"
2) "1"
  • set 数据类型
    set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。
    比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
127.0.0.1:6379> SADD s1 1 3 5 7 9   #设置一个集合;
(integer) 5
127.0.0.1:6379> SADD s2 2 4 6 8 10  1 3 5 7 9   #设置第二个集合;
(integer) 10
127.0.0.1:6379> SMEMBERS s1   #读取一个集合;
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
127.0.0.1:6379> SMEMBERS s2   
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> SREM s2 1 3 5  #删除集合中的元素;
(integer) 3
127.0.0.1:6379> SMEMBERS s2
1) "2"
2) "4"
3) "6"
4) "7"
5) "8"
6) "9"
7) "10"
127.0.0.1:6379> SINTER s1 s2   #两个集合的交集;
1) "7"
2) "9"
127.0.0.1:6379> SUNION s1 s2   #两个集合的并集;
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> SDIFF s1 s2   #两个集合的差集;
1) "1"
2) "3"
3) "5"
  • sorted set 数据类型
    sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
127.0.0.1:6379> ZADD z1 1 abc   #sorted set的一个元素,必须是一个数字加一个值;
(integer) 1
127.0.0.1:6379> ZADD z1 3 klkl
(integer) 1
127.0.0.1:6379> ZADD z1 4 oiio
(integer) 1
127.0.0.1:6379> ZADD z1 39 lll
(integer) 1
127.0.0.1:6379> ZADD z1 02 lll
(integer) 0
127.0.0.1:6379> ZRANGE z1 0 -1  #读取第一个到倒数第一个元素,按元素的数字排序;
1) "abc"
2) "lll"
3) "klkl"
4) "oiio"
127.0.0.1:6379> ZREVRANGE z1 0 -1  #倒序;
1) "oiio"
2) "klkl"
3) "lll"
4) "abc"
  • hash 数据类型
    在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。
127.0.0.1:6379> hset h1 name t  #一个hash数据,包含多对键和值;设置一个键值;
(integer) 1
127.0.0.1:6379> hset h1 age 33
(integer) 1
127.0.0.1:6379> hset h1 job it
(integer) 1
127.0.0.1:6379> hset h1 heigh  170
(integer) 1
127.0.0.1:6379> HGET h1 job  #读取其中一个键;
"it"
127.0.0.1:6379> HGETALL h1   #读取所有键;
1) "name"
2) "t"
3) "age"
4) "33"
5) "job"
6) "it"
7) "heigh"
8) "170"
tanyyinyu
发布了97 篇原创文章 · 获赞 4 · 访问量 2973
私信 关注

本文链接http://element-ui.cn/news/show-1204.aspx