Redis介绍和安装

redis介绍

1.redis是一个key-value存储系统,官方站点 http://redis.io和memcached类似,但支持数据持久化

2.支持更多value类型,除了和string外,还支持hash、lists(链表)、sets(集合)和sorted sets(有序集合)几种数据类型

3.redis使用了两种文件格式:全量数据(RDB)和增量请求(aof)。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载。增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据

4.redis的存储分为内存存储、磁盘存储和log文件三部分

注意:增量请求(aof)类似于mysql日志,下一次重启系统之后,redis根据日志,把数据重写一份到内存中,实现数据持久化。

 

Redis安装

实验环境

Redis安装-下载安装配置

1.wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21

2.mv  2.8.21  redis-2.8.21.tar.gz

3.tar zxvf redis-2.8.21.tar.gz

4.cd redis-2.8.21

5.yum install -y gcc epel-release; yum install -y jemalloc-devel

6.make  如果出错,运行如下命令:

7.cd deps; make hiredis lua jemalloc linenoise; cd ..; make

8.make PREFIX=/usr/local/redis  install

9.mkdir /usr/local/redis/etc

10.wget http://www.apelearn.com/study_v2/.redis_conf -O /usr/local/redis/etc/redis.conf 2>/dev/null

 

Redis安装 – 启动脚本

1.wget http://www.apelearn.com/study_v2/.redis_init -O /etc/init.d/redis 2>/dev/null

2.useradd -s /sbin/nologin redis

3.mkdir /usr/local/redis/var

4.chmod 777 /usr/local/redis/var

5.chmod 755 /etc/init.d/redis

6.chkconfig –add redis

7.chkconfig redis on

8.service redis start

 

Redis数据类型

Redis数据类型-string

string是最简单的类型,你可以理解成与Memcached一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。

示例:

启动redis的路径比较长/usr/local/redis/bin/redis-cli,我们可以做一个alias

[root@xclinux ~]# vim .bashrc

添加一行

alias redis-cli=’/usr/local/redis/bin/redis-cli ‘

[root@xclinux ~]# redis-cli

127.0.0.1:6379>

 

注意:

  1. redis支持多种语法。

redis-cli 后面直接跟语法

# redis-cli set mykey “aminglinux.com”
OK

# redis-cli get mykey
“aminglinux.com”

 

127.0.0.1:6379> set mykey “51centos.com”

OK

127.0.0.1:6379> mykey

(error) ERR unknown command ‘mykey’

127.0.0.1:6379> get mykey

“51centos.com”

 

输入redis-cli进入redis终端后输入语法

# redis-cli set mykey “aminglinux.com”
OK

# redis-cli get mykey
“aminglinux.com”
2.redis可以一次赋值多个值,并且读取。

127.0.0.1:6379> mset key1 1 key2 a key3 c

127.0.0.1:6379> mget key1 key2 key3

1) “1”

2) “a”

3) “c”

 

Redis数据类型-list

list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,然后工作线程再用pop操作将任务取出进行执行。

示例:

# redis-cli lpush list1  “aminglinux”
(integer) 1
# redis-cli lpush list1 “1 2 3”
(integer) 2
# redis-cli lpush list1 “aaaa bbb”
(integer) 3
# redis-cli lrange list1 0  -1
1) “aaaa bbb”
2) “1 2 3”
3) “aminglinux”
# redis-cli lrange list1 0 1
1) “aaaa bbb”
2) “1 2 3”

注:

lpop 从左侧开始取值

rpop从右侧开始取值

lpush从左侧开始插入

rpush从右侧开始插入

lrangge 从左侧开始,查看整个队列

 

Redis数据类型-set

set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。

# redis-cli sadd set1 a
(integer) 1
# redis-cli sadd set1 b
(integer) 1
# redis-cli sadd set1 d
(integer) 1
# redis-cli smembers set1
1) “b”
2) “d”
3) “a”

 

 

redis-cli smembers set1 显示的队列是随机的

 

 

 

Redis数据类型-sort set

sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。

# redis-cli zadd set2 12 “abc”
# redis-cli zadd set2 2 “cde 123”
# redis-cli zadd set2 24 “123-aaa”
# redis-cli zadd set2 4 “a123a”
# redis-cli zrange set2 0 -1
1) “cde 123”
2) “a123a”
3) “abc”
4) “123-aaa”
倒序 # redis-cli zrevrange set2 0 -1
1) “123-aaa”
2) “abc”
3) “a123a”
4) “cde 123”

 

Redis数据类型-hash

在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。

#redis-cli

127.0.0.1:6379> hset hash1 name aming
(integer) 1
127.0.0.1:6379> hget hash1 name
“aming”
127.0.0.1:6379> hset hash1  age 30
(integer) 1
127.0.0.1:6379> hget hash1 age
“30”
127.0.0.1:6379> hgetall hash1
1) “name”
2) “aming”
3) “age”
4) “30”

 

Redis持久化

Redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。

RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。

AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。

Redis配置讲解

 

Redis查看配置

[root@xclinux ~]# redis-cli

127.0.0.1:6379> config get *     //查看所有配置项

 

Redis通用配置

daemonize no  # 默认情况下,redis并不是以daemon形式来运行的。通过daemonize配置项可以控制redis的运行形式,yes 在后台运行 no 在前台运行。

pidfile /path/to/redis.pid    #当以daemon形式运行时,redis会生成一个pid文件,默认会生成在/var/run/redis.pid

bind 192.168.1.2 10.8.4.2 # 指定绑定的ip,可以有多个

port 6379  #指定监听端口

unixsocket /tmp/redis.sock  #也可以监听socket

unixsocketperm 755   #当监听socket时可以指定权限为755

timeout 0 #当一个redis-client一直没有请求发向server端,那么server端有权主动关闭这个连接,可以通过timeout来设置“空闲超时时限”,0表示永不关闭。

tcp-keepalive 0  #TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,假如设置为60秒,则server端会每60秒向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测。

loglevel notice # 日志级别,有四种debug, verbose, notice, warning

logfile “” #定义日志路径,

syslog-ident redis  #如果希望日志打印到syslog中,通过syslog-enabled来控制。另外,syslog-ident还可以让你指定syslog里的日志标志。

syslog-facility local0 # 指定syslog的设备,可以是USER或者local0-local7

databases 16  #设置数据库的总数量

 

Redis快照配置(rdb持久化)

save 900 1 #表示每15分钟且至少有1个key改变,就触发一次持久化

save 300 10 #表示每5分钟且至少有10个key改变,就触发一次持久化

save 60 10000 #表示每60秒至少有10000个key改变,就触发一次持久

save “”  #这样可以禁用rdb持久化

stop-writes-on-bgsave-error yes #rdb持久化写入磁盘避免不了会出现失败的情况,默认一旦出现失败,redis会马上停止写操作。如果你觉得无所谓,那就可以使用该选项关闭这个功能。

rdbcompression yes #是否要压缩

rdbchecksum yes #是否进行数据校验

dbfilename dump.rdb #定义快照文件的名字

dir ./  #定义快照文件储存路劲

 

Redis安全相关配置

requirepass aminglinux

#设置redis-server的密码

rename-command CONFIG  aminglinux.config

#将CONFIG命令更名为aminglinux.config,这样可以避免误操作,但如果使用了AOF持久化,建议不要启用该功能

rename-command CONFIG “”

#也可以后面定义为空,这样就禁掉了该CONFIG命令

 

Redis限制相关配置

maxclients 10000  #限制最大客户端连接数

maxmemory <bytes>  #设定最大内存使用数,单位是byte

maxmemory-policy volatile-lru #指定内存移除规则

maxmemory-samples 3 #LRU算法和最小TTL算法都并非是精确的算法,而是估算值。所以你可以设置样本的大小。假如redis默认会检查三个key并选择其中LRU的那个,那么你可以改变这个key样本的数量。

 

Redis AOF持久化相关配置

appendnly no  #如果是yes,则开启aof持久化

appendfilename “appendonly.aof” # 指定aof文件名字

appendfsync everysec #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync)。第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为第三种。

no-appendfsync-on-rewrite no  # 设置yes,可避免当写入量非常大时的磁盘io阻塞

auto-aof-rewrite-percentage 10 #规定什么情况下会触发aof重写。该值为一个比例,10表示当aof文件增幅达到10%时则会触发重写机制。

auto-aof-rewrite-min-size 64mb #重写会有一个条件,就是不能低于64Mb

 

Redis 慢日志相关配置

针对慢日志,你可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。

slowlog-log-slower-than 10000 #慢于10000ms则记录日志

slowlog-max-len 128  #日志长度

 

Redis主从配置

实验环境:

master 192.168.205.188

slave 192.168.205.187

需要安装好相同的redis环境

Redis安装配置主从

两台服务器: master (192.168.205.188) 和 slave (192.168.205.187)

分别按照之前介绍的步骤安装好redis并启动

master 配置文件不用动

slave 配置文件上加一行

slaveof  192.168.205.188 6379

masterauth  passwd  //如果主上设置了密码,要加这行

分别启动master和slave

 

[root@slave ~]# tail /usr/local/redis/var/redis.log

[5359] 08 Sep 02:08:08.857 * Non blocking connect for SYNC fired the event.

[5359] 08 Sep 02:08:08.857 * Master replied to PING, replication can continue…

[5359] 08 Sep 02:08:08.857 * Partial resynchronization not possible (no cached master)

[5359] 08 Sep 02:08:08.858 * Full resync from master: 2ecdf79431f6098923b0e40191c657b44d271aa2:1

[5359] 08 Sep 02:08:08.967 * MASTER <-> SLAVE sync: receiving 44 bytes from master

[5359] 08 Sep 02:08:08.967 * MASTER <-> SLAVE sync: Flushing old data

[5359] 08 Sep 02:08:08.967 * MASTER <-> SLAVE sync: Loading DB in memory

[5359] 08 Sep 02:08:08.967 * MASTER <-> SLAVE sync: Finished with success

[5359] 08 Sep 02:08:13.912 – DB 0: 1 keys (0 volatile) in 4 slots HT.

[5359] 08 Sep 02:08:13.913 – 1 clients connected (0 slaves), 424120 bytes in use

 

注意:

a.以上绿色字段说明主从配置成功

b.如果不成功可能是一下几种情况

1.主配置了redis密码,从未在配置文件中加入masterauth  passwd

2.主开启了selinux

测试redis主从

master上:

redis-cli

127.0.0.1:6379> keys *

1) “mykey1”

127.0.0.1:6379> set key1 xclinux

OK

127.0.0.1:6379> get key1

“xclinux”

127.0.0.1:6379> keys *      keys *可以查看redis库中所有的key

1) “mykey1”

2) “key1”

 

slave上:

redis-cli
127.0.0.1:6379> get key1

“xclinux”

127.0.0.1:6379> keys *

1) “key1”

2) “mykey1”

以上结果可以看出redis主从已经配置成功

 

 

Redis主从其他相关配置

slave-read-only yes  //让从只读

repl-ping-slave-period 10  //设置slave向master发起ping的频率,每10s发起一次

repl-timeout 60 //设置slave ping不通master多少s后就超时

repl-disable-tcp-nodelay no //是否开启tcp_nodelay,开启后将会使用更少的带宽,但会有延迟,所以建议关闭

repl-backlog-size 1mb //同步队列的长度,backuplog是master的一个缓冲区,主从断开后,master会先把数据写到缓冲区,slave再次连接会从缓冲区中同步数据

repl-backlog-ttl 3600  //主从断开后,缓冲区的有效期,默认1小时

slave-priority 100 //多个slave是可以设置优先级的,数值越小优先级越高,应用于集群中,支持slave切换为master,优先级最高的才会切换

min-slaves-to-write 3  //和下面的一起使用,它的意思是master发现有超过3个slave的延迟高于10s,那么master就会暂时停止写操作。这两个数值任何一个为0,则关闭该功能,默认第一数值是0。

min-slaves-max-lag 10

 

 

redis的五种数据类型详解

http://blog.csdn.net/gaogaoshan/article/details/41039581/

string类型常用命令

set key1  aminglinux

get key1

set key1  aming //一个key对应一个value,多次赋值,会覆盖前面的value

setnx key2 aaa   //返回1

get key2

setnx key2 bbb  //返回0

说明:setnx 如果key存在,则返回0,不存在会直接创建这个key

setex key3  10  1  //这个是用来给key设定过期时间的

mset  key1 1  key2 2 key3  3   //同时设置多个key

mget key1 key2 key3

 

 

Hash数据常用操作

hset user1  name aming  //建立hash

hset user1 age 30

hset user1 job  it

hgetall user1

hmset user2  name aming age 30  job it    //批量建立键值对

hmget user2

hmget user2 name age  job

hdel user2 job   //删除指定filed

hkeys user2   //打印所有的key

hvals user2  //打印所有的values

hlen user2  //查看hash有几个filed

list数据常用操作

lpush lista  a  //从左侧压入一个元素

lpush lista b

lrange lista  0 -1 //0 为头,-1为尾

lpop lista   //从左侧取出

rpush lista  1   //从右侧压入一个元素

rpush lista  2

lrange lista  0 -1

rpop lista    //从右侧取第一个元素

linsert  lista  before  2 3  //在2的前面插入一个元素为3

lset lista 4 bbb  //把第5个元素修改为bbb

lindex lista 0  //查看第1个元素

lindex lista 3  //查看第4个元素

llen lista  //查看链表中有几个元素

 

 

set数据常用操作

sadd seta aaa  //向集合seta中放入元素

smembers seta   //查看集合中的所有元素

srem  seta    aaa //删除元素

spop  seta    //随机取出一个元素,删除

sdiff  seta  setb   //求差集,以seta为标准

sdiffstore setc seta setb   //求差集并且存储,存储到了setc里

sinter seta setb    //求交集

sinterstore  setd seta setb  //将交集存储setd

sunion seta setb  //求并集

sunionstore sete seta setb   //求并集并存储到sete

sismember seta aaa  //判断一个元素是否属于一个集合

srandmember  seta  //随机取出一个元素,但不删除

 

 

zset数据常用操作

zadd zseta 11 123 //创建有序集合  //必须先指定分值,这里的11就是分值

zrange zseta 0 -1   //显示所有元素,按顺序显示

zrange zseta 0 -1 withscores   //可以带上分值

zrem zseta 222  //删除指定元素

zrank zseta  222  //返回元素的索引值,索引值从0开始,按score正向排序

zrevrank zseta 222   //同上,不同的是,按score反序排序

zrevrange  zseta  0 -1  反序显示所有元素,并带分值

zcard zseta  //返回集合中所有元素的个数

zcount  zseta 1 10  //  返回分值范围1-10的元素个数

zrangebyscore  zseta 1 10 // 返回分值范围1-10的元素

zremrangebyrank zseta  0 2  //删除索引范围0-2的元素,按score正向排序

zremrangebyscore zseta  1 10 //删除分值范围1-10的元素

 

 

 

 

键值相关操作

keys *    //取出所有key

keys my* //模糊匹配

exists name  //有name键 返回1 ,否则返回0;

del  key1 // 删除一个key    //成功返回1 ,否则返回0;

EXPIRE key1 100  //设置key1 100s后过期

ttl key // 查看键 还有多长时间过期,单位是s,当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,返回 key 的剩余生存时间。

select  0  //代表选择当前数据库,默认进入0 数据库

move age 1  // 把age 移动到1 数据库

persist key1   //取消key1的过期时间

randomkey //随机返回一个key

rename oldname newname //重命名key

type key1 //返回键的类型

 

 

服务相关操作

dbsize  //返回当前数据库中key的数目

info  //返回redis数据库状态信息

flushdb //清空当前数据库中所有的键

flushall    //清空所有数据库中的所有的key

 

 

 

php使用Redis存储

Redis扩展模块安装

wget https://codeload.github.com/phpredis/phpredis/zip/develop

mv develop phpredis.zip

unzip phpredis.zip

cd phpredis-develop

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config

make && make install

此时可以看到在/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/目录下生成了redis.so文件

vim /usr/local/php/php.ini  // 增加一行extension = redis.so

/usr/local/php/bin/php -m |grep redis 检查是否成功

php redis中文文档 http://www.cnblogs.com/weafer/archive/2011/09/21/2184059.html

 

 

Redis实现session共享

php.ini中加入

session.save_handler = “redis”

session.save_path = “tcp://127.0.0.1:6379″

或者apache虚拟主机加入

php_value session.save_handler ” redis”
php_value session.save_path ” tcp://127.0.0.1:6379″

或者php-fpm.conf对应的pool中加入

php_value[session.save_handler] = redis

php_value[session.save_path] = ” tcp://127.0.0

Redis存储session测试

wget http://study.lishiming.net/.mem_se.txt

mv .mem_se.txt  /usr/local/apache2/htdocs/session.php

curl localhost/session.php

输出类似于 1473499973<br><br>1473499973<br><br>02skmsi3t5p5h8patrq2a6r4v5

/usr/local/redis/bin/redis-cli

127.0.0.1:6379> keys * //可以把所有的key都列出来

1) “PHPREDIS_SESSION:02skmsi3t5p5h8patrq2a6r4v5”

127.0.0.1:6379> get PHPREDIS_SESSION:02skmsi3t5p5h8patrq2a6r4v5

“TEST|i:1473499973;TEST3|i:1473499973;”

 

以上的结果可以看到,redis的session共享已经生效。

下面我们同样可以使用windows 浏览器来测试

未经允许不得转载: » Redis介绍和安装
微信公众号:这是个测试
关注我们,每天分享更多有趣的事儿,有趣有料!
12000人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏