Redis学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习笔记相关的知识,希望对你有一定的参考价值。

详细参考:http://www.yiibai.com/redis/

1.Redis概述

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

 

2.Redis优点

 性能很高 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。

 支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。

 操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。

 丰富的特性:支持publish/subscribe,通知,key过期等特性

 redis支持主从复制

 支持持久化数据存储

 

3.redis的数据类型

Redis支持5种数据类型,它们描述如下:

 

1)Strings - 字符串

Redis的字符串是字节序列。在Redis中字符串是二进制安全的,这意味着他们有一个已知的长度,是没有任何特殊字符终止决定的,所以可以存储任何东西,最大长度可达512兆。

例子

redis 127.0.0.1:6379> SET name "yiibai"
OK
redis 127.0.0.1:6379> GET name
"yiibai"


在上面的例子使用Redis命令set和get,Redis的名称是yiibai的键存储在Redis的字符串值。

注:字符串值可以存储最大512兆字节的长度。

 

2)Hashes - 哈希值

Redis的哈希键值对的集合。 Redis的哈希值是字符串字段和字符串值之间的映射,所以它们被用来表示对象

例子

redis 127.0.0.1:6379> HMSET user:1 username yiibai password yiibai points 200
OK
redis 127.0.0.1:6379> HGETALL user:1
 
1) "username"
2) "yiibai"
3) "password"
4) "yiibai"
5) "points"
6) "200"


在上面的例子中的哈希数据类型,用于存储包含用户的基本信息用户的对象。这里HMSET,HEXTALL对于Redis 命令 user:1 是键。

每个哈希可存储多达232 - 1个 字段 - 值对(超过4十亿)。

 

3)Lists - 列表

Redis的列表是简单的字符串列表,排序插入顺序。可以添加元素到Redis列表的头部或尾部。

例子

redis 127.0.0.1:6379> lpush tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> lpush tutoriallist mongodb
(integer) 2
redis 127.0.0.1:6379> lpush tutoriallist rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange tutoriallist 0 10
 
1) "rabitmq"
2) "mongodb"
3) "redis"


列表的最大长度为232- 1元素(4294967295,每个列表中的元素超过4十亿)。

 

4)Sets - 集合

Redis集合是字符串的无序集合。在Redis中可以添加,删除和测试文件是否存在在O(1)的时间复杂度的成员。

例子

redis 127.0.0.1:6379> sadd tutoriallist redis
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist mongodb
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd tutoriallist rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers tutoriallist
 
1) "rabitmq"
2) "mongodb"
3) "redis"


注意:在上面的例子中rabitmq设置属性加两次,但由于唯一性只加一次。

成员中集最大数量为232 - 1(4294967295,集合成员超过4十亿)。

 

5)集合排序

Redis的集合排序类似于Redis集合,字符串不重复的集合。不同的是,一个有序集合的每个成员关联分数,用于以便采取有序set命令,从最小的到最大的分数有关。虽然成员都是独一无二的,分数可能会重复。

例子

redis 127.0.0.1:6379> zadd tutoriallist 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000
 
1) "redis"
2) "mongodb"
3) "rabitmq"


 

 

4.Redis的应用场景

1)Redis适用场景全部数据在memory

2)替代Memcached使用

3)除了key/value之外更多的数据类型支持

4)支持持久化

5)需要负载均衡的场景(redis主从同步)

5.Redis的安装和使用

1)安装步骤

  wget http://download.redis.io/releases/redis-3.2.4.tar.gz
  tar xf redis-3.2.4.tar.gz 
  cd redis-3.2.4
  make MALLOC=jemalloc
  make PREFIX=/application/redis-3.2.4 install
  ln -s /application/redis-3.2.4/ /application/redis
 
 [[email protected]_3 redis-3.2.4]# tree /application/redis/bin/
/application/redis/bin/
├── redis-benchmark
├── redis-check-aof
├── redis-check-rdb
├── redis-cli
├── redis-sentinel -> redis-server
└── redis-server
 
0 directories, 6 files
[[email protected]_3 redis-3.2.4]#



2)配置启动redis

添加redis的环境变量  

echo “PATH=/application/redis/bin/:$PATH”  >>/etc/profile
source /etc/profile


从解压目录移动redis.conf到redis安装目录下

mkdir /application/redis/conf
cd /tools/redis-3.2.4/
cp redis.conf /application/redis/conf/
ls /application/redis/conf
[[email protected]_3 redis-3.2.4]# ls /application/redis/conf
redis.conf


3)启动redis

redis-server /application/redis/conf/redis.conf &

警告1:

4095:M 28 Sep 13:13:36.835 # 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.

解决:

[[email protected]_3 redis-3.2.4]# sysctl vm.overcommit_memory=1
[[email protected]_3 redis-3.2.4]# echo "vm.overcommit_memory = 1"  >> /etc/sysctl.conf 
[[email protected]_3 redis-3.2.4]# tail -1 /etc/sysctl.conf
vm.overcommit_memory = 1
[[email protected]_3 redis-3.2.4]#


警告2:

4103:M 28 Sep 13:16:41.123 # 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.

解决:

[[email protected]_3 redis-3.2.4]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[[email protected]_3 redis-3.2.4]# echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local 
[[email protected]_3 redis-3.2.4]# tail -1 /etc/rc.local 
tail: inotify cannot be used, reverting to polling
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[[email protected]_3 redis-3.2.4]#


 

4)关闭Redis

redis-cli shutdown

[[email protected]_3 redis-3.2.4]# redis-cli shutdown
4121:M 28 Sep 13:27:34.602 # User requested shutdown...
4121:M 28 Sep 13:27:34.602 * Saving the final RDB snapshot before exiting.
4121:M 28 Sep 13:27:34.603 * DB saved on disk
4121:M 28 Sep 13:27:34.603 * Removing the pid file.
4121:M 28 Sep 13:27:34.604 # Redis is now ready to exit, bye bye...
[1]+  Done                    redis-server /application/redis/conf/redis.conf
[[email protected]_3 redis-3.2.4]#


 

5)连接Redis

1)本地连接

[[email protected]_3 redis-3.2.4]# redis-cli 
127.0.0.1:6379> set 001 ok
OK
127.0.0.1:6379> get 001
"ok"
127.0.0.1:6379>

 

2)远程连接

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  -h <hostname>      Server hostname (default: 127.0.0.1).
  -p <port>          Server port (default: 6379).
  -s <socket>        Server socket (overrides hostname and port).
  -a <password>      Password to use when connecting to the server.
  -r <repeat>        Execute specified command N times.
  -i <interval>      When -r is used, waits <interval> seconds per command.

交互式操作:

[[email protected]_3 redis-3.2.4]# redis-cli -h 192.168.1.113 -p 6379
192.168.1.113:6379> set 002 testok
OK
192.168.1.113:6379> get 002
"testok"
192.168.1.113:6379>

非交互式操作:

[[email protected]_3 bin]# redis-cli -h 192.168.1.113 -p 6379 set 001 dong
OK
[[email protected]_3 bin]# redis-cli -h 192.168.1.113 -p 6379 set 002 xi
OK
[[email protected]_3 bin]# redis-cli -h 192.168.1.113 -p 6379 get 001 
"dong"
[[email protected]_3 bin]# redis-cli -h 192.168.1.113 -p 6379 get 002
"xi"
[[email protected]_3 bin]#

 

6.php安装redis扩展模块

wget https://codeload.github.com/phpredis/phpredis/zip/
unzip master
cd phpredis-master/
phpize 
./configure --with-php-config=/usr/bin/php-config
make && make install
vim /etc/php.ini   配置文件修改以下两项
     extension_dir = "/usr/lib64/php/modules/"
     extension = redis.so
重启php服务
pkill  php-fpm
php-fpm -c /etc/php.ini -D

phpinfo测试

技术分享

7.redis配置主从同步

  1)概述

从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;

从容量上,单个Redis服务器内存容量有限,一般情况下,单台Redis最大使用内存不应该超过20G。

  2)主从同步配置

redis主从同步只需要修改从库的配置文件,指定主库的地址和端口即可

示例:192.168.1.112为redis从库,192.168.1.113为主库

注意:默认从库是只读的,且主从库的数据都是一样

[[email protected]_02 redis-3.2.4]# grep slaveof /application/redis/conf/redis.conf 
# slaveof <masterip> <masterport>
slaveof 192.168.1.113 6379              --只需修改此部分
[[email protected]_02 redis-3.2.4]#

测试:

主库写操作1

[[email protected]_3 bin]# redis-cli -h 192.168.1.113 -p 6379
192.168.1.113:6379> set 001 dong
OK
192.168.1.113:6379> get 001
"dong"
192.168.1.113:6379>

主库删除操作2

192.168.1.113:6379> del 001
(integer) 1
192.168.1.113:6379> get 001
(nil)
192.168.1.113:6379>


从库读操作1

[[email protected]_02 redis-3.2.4]# redis-cli 
127.0.0.1:6379> get 001
"dong"
127.0.0.1:6379>

从库读操作2

127.0.0.1:6379> get 001
(nil)
127.0.0.1:6379>

 


本文出自 “秦仙儿” 博客,请务必保留此出处http://youdong.blog.51cto.com/3562886/1859462

以上是关于Redis学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习笔记5:JedisRedisTemplate

Redis学习笔记5:JedisRedisTemplate

redis学习笔记: ae

redis学习笔记: replication

Redis学习笔记jedis(JedisCluster)操作Redis集群 redis-cluster

DOM探索之基础详解——学习笔记