1、Redis概述;
2、应用场景分析;
3、Redis的数据回收策略;
4、案例:搭建Redis高性能数据库;php
概述:redis是一个可持久化的单进程单线程key-value类型高速内存缓存系统,和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(列表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做。
与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会按期经过异步操做把数据库数据flush到硬盘上进行保存。由于是纯内存操做,Redis的性能很是出色,每秒能够处理超过 10万次读写操做,是已知性能最快的Key-Value DB,而且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经很是普遍,国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。官网地址:https://redis.io/ ,目前由redis项目的开发和维护由vmware厂商负责提供支持;html
优势:
1.性能极高--Redis能支持超过 100K+ 每秒的读写频率。
2.丰富的数据类型--Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操做。
3.原子性--Redis的全部操做都是原子性(即全部操做要么成功要么失败不执行),同时Redis还支持对几个操做全并后的原子性执行。
4.Redis运行在内存中可是能够持久化到磁盘,因此在对不一样数据集进行高速读写时须要权衡内存,由于数据量不能大于硬件内存。在内存数据库方面的另外一个优势是,相比在磁盘上相同的复杂的数据结构,在内存中操做起来很是简单,这样Redis能够作不少内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,由于他们并不须要进行随机访问。git
MySql+Memcached架构的问题:实际MySQL是适合进行海量数据存储的,经过Memcached将热点数据加载到cache,加速访问,不少公司都曾经使用过这样的架构,但随着业务数据量的不断增长,和访问量的持续增加,咱们遇到了不少问题:
1.MySQL须要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工做占据大量开发时间。
2.Memcached与MySQL数据库数据一致性问题。
3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL没法支撑。
4.跨机房cache同步问题。github
Redis的应用场景:
Redis更像一个增强版的Memcached,那么什么时候使用Memcached,什么时候使用Redis呢?
1.Redis不只仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2.Redis支持数据的备份,即master-slave模式的数据备份。
3.Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重启的时候能够再次加载进行使用。
4.Memcached:动态系统中减轻数据库负载,提高性能;作缓存,适合多读少写,大数据量的状况(如人人网大量查询用户信息、好友信息、文章信息等)。
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。redis
Redis的回收策略:
volatile-lru:从已设置过时时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;
volatile-ttl:从已设置过时时间的数据集(server.db[i].expires)中挑选将要过时的数据淘汰;
volatile-random:从已设置过时时间的数据集(server.db[i].expires)中任意选择数据淘汰;
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰;
no-enviction(驱逐):禁止驱逐数据;数据库
实验步骤:
安装并配置Redis服务;
调整Redis服务的配置;
结合PHP测试Redis服务;
Redis中操做之String;
Redis中操做之list;
Redis中操做之set;
Redis中操做之zset;
Redis中操做之hash;
Redis中操做之其余操做;json
安装并配置Redis服务; [root@redis ~]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz [root@redis ~]# tar zxvf redis-4.0.9.tar.gz [root@redis ~]# cd redis-4.0.9 [root@redis redis-4.0.9]# make [root@redis redis-4.0.9]# echo $? [root@redis redis-4.0.9]# cd [root@redis ~]# mkdir -p /usr/local/redis [root@redis ~]# cp /root/redis-4.0.9/src/redis-server /usr/local/redis/ ##服务端程序 [root@redis ~]# cp /root/redis-4.0.9/src/redis-cli /usr/local/redis/ ##客户端程序 [root@redis ~]# cp /root/redis-4.0.9/redis.conf /usr/local/redis/ ##主配置文件 [root@redis ~]# ls /usr/local/redis/ redis-cli redis.conf redis-server [root@redis ~]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.100.101/g' /usr/local/redis/redis.conf [root@redis ~]# sed -i '/protected-mode/s/yes/no/g' /usr/local/redis/redis.conf ##关闭redis的保护模式 [root@redis ~]# sed -i '/daemonize/s/no/yes/g' /usr/local/redis/redis.conf ##开启redis的后台守护进程模式 [root@redis ~]# sed -i '/requirepass/s/foobared/123123/g' /usr/local/redis/redis.conf ##设置redis的密码为123123 [root@redis ~]# sed -i '/requirepass 123123/s/^#//g' /usr/local/redis/redis.conf ##开启redis的密码 附:redis.conf主配置文件详解 daemonize yes #之后台daemon方式运行redis pidfile "/var/run/redis.pid" #redis之后台运行,默认pid文件路径/var/run/redis.pid port 6379 #默认端口 bind 127.0.0.1 #默认绑定本机全部ip地址,为了安全,能够只监听内网ip timeout 300 #客户端超时设置,单位为秒 loglevel verbose #设置日志级别,支持四个级别:debug、notice、verbose、warning logfile stdout #日志记录方式,默认为标准输出,logs不写文件,输出到空设备/deb/null logfile "/usr/local/redis/var/redis.log" #能够指定日志文件路径 databases 16 #开启数据库的数量 save 900 1 save 300 10 save 60 10000 建立本地数据库快照,格式:save * * 900秒内,执行1次写操做后触发快照 300秒内,执行10次写操做 60秒内,执行10000次写操做 rdbcompression yes #启用数据库lzf压缩,也能够设置为no dbfilename dump.rdb #本地快照数据库名称 dir "/usr/local/redis/var/" #本地快照数据库存放目录 requirepass 123456 #设置redis数据库链接密码 maxclients 10000 #同一时间最大客户端链接数,0为无限制 maxmemory 1024MB #设定redis最大使用内存,值要小于物理内存,必须设置 appendonly yes #开启日志记录,至关于MySQL的binlog appendfilename "appendonly.aof" #日志文件名,注意:不是目录路径 appendfsync everysec #设置日志同步的频率,每秒执行同步,还有两个参数always、no通常设置为everysec,至关于MySQL事物日志的写方式 Slaveof 设置数据库为其余数据库的从数据库 Masterauth 主数据库链接须要的密码验证 vm-enabled 是否开启虚拟内存支持 (vm开头的参数都是配置虚拟内存的) vm-swap-file 设置虚拟内存的交换文件路径 vm-max-memory 设置redis使用的最大物理内存大小 vm-page-size 设置虚拟内存的页大小 vm-pages 设置交换文件的总的page数量 vm-max-threads 设置使用swap存储同时使用的线程数量,一般设置值为核心数相同,若是设置为0,则会以串行方式,对数据的完整性有着极大的保证 Glueoutputbuf 把小的输出缓存存放在一块儿 hash-max-zipmap-entries 设置hash的临界值 Activerehashing 从新hash [root@redis ~]# cat <<END >>/etc/init.d/redis #!/bin/sh # chkconfig: 2345 80 90 # description: Start and Stop redis #PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/redis/redis-server REDIS_CLI=/usr/local/redis/redis-cli PIDFILE=/var/run/redis_6379.pid CONF="/usr/local/redis/redis.conf" AUTH="123123" LISTEN_IP=\$(netstat -utpln |grep redis-server |awk '{print \$4}'|awk -F':' '{print \$1}') case "\$1" in start) if [ -f \$PIDFILE ] then echo "\$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." \$EXEC \$CONF fi if [ "\$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f \$PIDFILE ] then echo "\$PIDFILE does not exist, process is not running" else PID=\$(cat \$PIDFILE) echo "Stopping ..." \$REDIS_CLI -h \$LISTEN_IP -p \$REDISPORT -a \$AUTH SHUTDOWN while [ -x \${PIDFILE} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) \${0} stop \${0} start ;; *) echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2 exit 1 esac END [root@redis ~]# chmod 755 /etc/init.d/redis [root@redis ~]# chkconfig --add redis [root@redis ~]# /etc/init.d/redis start Starting Redis server... 4390:C 04 May 02:16:45.232 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 4390:C 04 May 02:16:45.232 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4390, just started 4390:C 04 May 02:16:45.232 # Configuration loaded Redis is running... [root@redis ~]# netstat -utpln |grep redis tcp 0 192.168.100.101:6379 0.0.0.0:* LISTEN 4204/redis-server * 调整Redis服务的配置: [root@redis ~]# cp /root/redis-4.0.9/src/redis-benchmark /usr/local/redis/ [root@redis ~]# cp /root/redis-4.0.9/src/redis-check-rdb /usr/local/redis/ [root@redis ~]# cp /root/redis-4.0.9/src/redis-check-aof /usr/local/redis/ [root@redis ~]# cp /root/redis-4.0.9/src/redis-sentinel /usr/local/redis/ [root@redis ~]# ls /usr/local/redis/ dump.rdb redis-benchmark redis-cli redis.conf redis-server [root@redis ~]# ln -s /usr/local/redis/redis-cli /usr/bin/redis [root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> set name lwh OK 192.168.100.101:6379> get name "lwh" 192.168.100.101:6379> exit [root@redis ~]# ln -s /usr/local/redis/redis-benchmark /usr/bin/redis-benchmark [root@redis ~]# redis-benchmark -h 192.168.100.101 -p 6379 -c 1000 -n 10000 结合PHP测试Redis服务; [root@redis ~]# yum -y install httpd php php-redis php-devel [root@redis ~]# php -v PHP 5.4.16 (cli) (built: Mar 7 2018 13:34:47) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies [root@redis ~]# wget https://codeload.github.com/phpredis/phpredis/tar.gz/4.0.2 [root@redis ~]# tar zxvf phpredis-4.0.2.tar.gz [root@redis ~]# cd phpredis-4.0.2 [root@redis phpredis-4.0.2]# /usr/bin/phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@redis phpredis-4.0.2]# ./configure --with-php-config=/usr/bin/php-config [root@redis phpredis-4.0.2]# make && make install [root@redis phpredis-4.0.2]# echo $? 0 [root@redis phpredis-4.0.2]# cd [root@redis ~]# echo -e "extension_dir = \"/usr/lib64/php/modules/\"\nextension = redis.so" >>/etc/php.ini [root@redis ~]# systemctl start httpd [root@redis ~]# netstat -utpln |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19008/httpd [root@redis ~]# cat <<END >>/var/www/html/index.php <?php phpinfo(); ?> END [root@redis ~]# cat <<END >>/var/www/html/test.php <?php \$redis = new Redis(); \$redis->connect('192.168.100.101',6379); \$redis->auth('123123'); \$keys = \$redis->keys("*"); var_dump(\$keys); ?> END
Redis中操做之String -- 字符串(注意:redis中的语句能够tab补全); 概述:String是简单的 key-value 键值对,value 不只能够是 String,也能够是数字。String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操做时会转成数值型进行计算,此时redisObject的encoding字段为int。 [root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> set hello world OK 192.168.100.101:6379> get hello "world" 192.168.100.101:6379> EXISTS hello ##验证key是否存在 (integer) 1 192.168.100.101:6379> type hello string 192.168.100.101:6379> substr hello 1 2 ##查看key的第1和2两个字符 "or" 192.168.100.101:6379> append hello ! ##在key后添加字符! (integer) 6 192.168.100.101:6379> get hello "world!" 192.168.100.101:6379> set haha heihei OK 192.168.100.101:6379> keys h* ##查看以h开头的Key 1) "haha" 2) "hello" 192.168.100.101:6379> set name xiaoming OK 192.168.100.101:6379> keys * 1) "haha" 2) "hello" 3) "name" 192.168.100.101:6379> RANDOMKEY ##随机返回一个Key "name" 192.168.100.101:6379> keys * 1) "haha" 2) "hello" 3) "name" 192.168.100.101:6379> RANDOMKEY "haha" 192.168.100.101:6379> RENAME haha hehe OK 192.168.100.101:6379> keys * 1) "hehe" 2) "name" 3) "hello" 192.168.100.101:6379> DEL hehe (integer) 1 192.168.100.101:6379> keys * 1) "name" 2) "hello" 192.168.100.101:6379> get name "xiaoming" 192.168.100.101:6379> set name xiaohong OK 192.168.100.101:6379> get name "xiaohong" 192.168.100.101:6379> expire name 10 ##设置KEY值的超时时间 (integer) 1 192.168.100.101:6379> ttl name ##查看KEY值当前剩余的超时时间 (integer) 4 192.168.100.101:6379> get name "xiaohong" 192.168.100.101:6379> get name (nil) 192.168.100.101:6379> keys * 1) "hello"
Redis中操做之list -- 列表;
概述:Redis列表是简单的字符串列表,能够类比到C++中的std::list,简单的说就是一个链表或者说是一个队列。能够从头部或尾部向Redis列表添加元素。列表的最大长度为2^32 - 1,也即每一个列表支持超过40亿个元素。Redis list的实现为一个双向链表,便可以支持反向查找和遍历,更方便操做,不过带来了部分额外的内存开销,Redis内部的不少实现,包括发送缓冲队列等也都是用的这个数据结构。
应用场景:Redis list的应用场景很是多,也是Redis最重要的数据结构之一,好比twitter的关注列表、粉丝列表等均可以用Redis的list结构来实现,再好比有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者push,消费者pop/bpop。数组
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> rpush list1 1 ##建立列表并在尾部插入元素 (integer) 1 192.168.100.101:6379> rpush list1 2 (integer) 2 192.168.100.101:6379> lrange list1 0 1 ##验证列表中的第0个元素到第1个元素 1) "1" 2) "2" 192.168.100.101:6379> lpush list1 0 ##在列表头部插入元素 (integer) 3 192.168.100.101:6379> lrange list1 0 1 1) "0" 2) "1" 192.168.100.101:6379> lrange list1 0 2 ##验证列表中的第0个元素到第2个元素 1) "0" 2) "1" 3) "2" 192.168.100.101:6379> llen list1 ##查看列表中的元素的数量 (integer) 3 192.168.100.101:6379> lindex list1 1 ##定位到列表中的第1个元素 "1" 192.168.100.101:6379> ltrim list1 1 2 ##截取列表中的第1个元素到第2个元素 OK 192.168.100.101:6379> lrange list1 0 10 ##查看列表中第0个元素到第10个元素 1) "1" 2) "2" 192.168.100.101:6379> lset list1 1 haha ##更改列表中的第1个元素值为haha OK 192.168.100.101:6379> lrange list1 0 10 1) "1" 2) "haha" 192.168.100.101:6379> lset list1 2 haha ##验证更改时的元素位置不能大于现有元素的数量 (error) ERR index out of range 192.168.100.101:6379> lrange list1 0 10 1) "1" 2) "haha" 192.168.100.101:6379> rpush list1 haha ##在列表尾部插入新的元素 (integer) 3 192.168.100.101:6379> lrange list1 0 10 1) "1" 2) "haha" 3) "haha" 192.168.100.101:6379> lrem list1 2 haha ##删除列表中两个值为haha的元素 (integer) 2 192.168.100.101:6379> lrange list1 0 10 1) "1" 192.168.100.101:6379> rpush list1 haha (integer) 2 192.168.100.101:6379> rpush list1 haha (integer) 3 192.168.100.101:6379> rpush list1 haha (integer) 4 192.168.100.101:6379> rpush list1 haha (integer) 5 192.168.100.101:6379> lrange list1 0 10 1) "1" 2) "haha" 3) "haha" 4) "haha" 5) "haha" 192.168.100.101:6379> lpop list1 ##删除列表内开头的第一个元素 "1" 192.168.100.101:6379> lrange list1 0 10 1) "haha" 2) "haha" 3) "haha" 4) "haha" 192.168.100.101:6379> lpop list1 "haha" 192.168.100.101:6379> lrange list1 0 10 1) "haha" 2) "haha" 3) "haha"
Redis中操做之set -- 无序集合;
概述:能够理解为一堆值不重复的列表,相似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操做。set 的内部实现是一个 value永远为null的HashMap,实际就是经过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的缘由。
应用场景:Redis set对外提供的功能与list相似是一个列表的功能,特殊之处在于set是能够自动排重的,当你须要存储一个列表数据,又不但愿出现重复数据时,set是一个很好的选择,而且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。又或者在微博应用中,每一个用户关注的人存在一个集合中,就很容易实现求两我的的共同好友功能。缓存
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> sadd set1 0 ##建立set1并赋值0 (integer) 1 192.168.100.101:6379> sadd set1 1 ##在set1后追加值1 (integer) 1 192.168.100.101:6379> smembers set1 ##显示set1的全部值 1) "0" 2) "1" 192.168.100.101:6379> scard set1 ##显示set1的基数 (integer) 2 192.168.100.101:6379> sismember set1 0 ##显示set1中是否包含值为0的元素 (integer) 1 192.168.100.101:6379> srandmember set1 ##随机返回set1中的的元素值 "0" 192.168.100.101:6379> sadd set2 0 ##建立set2并添加元素 (integer) 1 192.168.100.101:6379> sadd set2 2 (integer) 1 192.168.100.101:6379> sinter set1 set2 ##过滤set1与set2的交集 1) "0" 192.168.100.101:6379> sinterstore set3 set1 set2 ##将set1与set2的交集保存到set3 (integer) 1 192.168.100.101:6379> smembers set3 1) "0" 192.168.100.101:6379> sunion set1 set2 ##过滤set1与set2的并集 1) "0" 2) "1" 3) "2" 192.168.100.101:6379> sdiff set1 set2 ##相对与set2来说,set1的差集 1) "1" 192.168.100.101:6379> sdiff set2 set1 ##相对比set1来说,set2的差集 1) "2" 192.168.100.101:6379> keys * ##查看已经存在的各类数据类型的键 1) "set1" 2) "hello" 3) "list" 4) "list1" 5) "set2"
Redis中操做之zset -- 有序集合;
概述:Redis有序集合相似Redis无序集合,不一样的是增长了一个功能,即集合是有序的。一个有序集合的每一个成员带有分数,用于进行排序。Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,不管里面包含的元素集合的数量)。列表的最大长度为2^32- 1元素(4294967295,超过40亿每一个元素的集合)。
Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是全部的成员,排序依据是HashMap里存的score,使用跳跃表的结构能够得到比较高的查找效率,而且在实现上比较简单。
使用场景:Redis sorted set的使用场景与set相似,区别是set不是自动有序的,而sorted set能够经过用户额外提供一个优先级(score)的参数来为成员排序,而且是插入有序的,即自动排序。当你须要一个有序的而且不重复的集合列表,那么能够选择sorted set数据结构; 安全
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> zadd zset1 1 baidu.com ##建立集合zset1,添加元素baidu.com,而且设置元素的score值(有序集合的序列号)为1 (integer) 1 192.168.100.101:6379> zadd zset1 2 sina.com (integer) 1 192.168.100.101:6379> zadd zset1 3 qq.com (integer) 1 192.168.100.101:6379> zrange zset1 0 2 ##查看集合zset1中的元素 1) "baidu.com" 2) "sina.com" 3) "qq.com" 192.168.100.101:6379> zcard zset1 ##查看集合zset1中的基数 (integer) 3 192.168.100.101:6379> zscore zset1 baidu.com ##验证元素baidu.com在集合zset1中的score值 "1" 192.168.100.101:6379> zscore zset1 qq.com ##验证元素qq.com在集合zset1中的score值 "3" 192.168.100.101:6379> zrevrange zset1 0 1 ##倒序查找集合中的元素, 1) "qq.com" 2) "sina.com" 192.168.100.101:6379> zrem zset1 qq.com ##删除集合中的元素qq.com (integer) 1 192.168.100.101:6379> zrange zset1 0 5 ##验证集合中的全部元素 1) "baidu.com" 2) "sina.com" 192.168.100.101:6379> zincrby zset1 5 taobao.com ##设置该元素score值为5.如若此元素不存在,则会添加到集合中 "5" 192.168.100.101:6379> zrange zset1 0 5 ##验证集合中的原色 1) "baidu.com" 2) "sina.com" 3) "taobao.com" 192.168.100.101:6379> zrange zset1 0 5 withscores ##查看集合中的元素值而且输出其自己的score值 1) "baidu.com" 2) "1" 3) "sina.com" 4) "2" 5) "taobao.com" 6) "5" 192.168.100.101:6379> zincrby zset1 10 haha.com ##添加新元素haha.com并指定其自己score值 "10" 192.168.100.101:6379> zrange zset1 0 5 withscores ##验证元素的排序 1) "baidu.com" 2) "1" 3) "sina.com" 4) "2" 5) "taobao.com" 6) "5" 7) "haha.com" 8) "10" 192.168.100.101:6379> zincrby zset1 15 baidu.com ##如若新添加的元素已经存在,那么会在原有score值的基础上增长指定得score值 "16" 192.168.100.101:6379> zrange zset1 0 5 withscores ##验证元素baidu.com的score值变为16,增长了15,并排序到集合的末尾 1) "sina.com" 2) "2" 3) "taobao.com" 4) "5" 5) "haha.com" 6) "10" 7) "baidu.com" 8) "16" 注:此外, 还有zrevrank, zrevrange, zrangebyscore, zremrangebyrank, zramrangebyscore, zinterstore/zunionstore等操做
Redis中操做之hash ;
概述:相似C#中的dict类型或者C++中的hash_map类型。Redis Hash对应Value内部实际就是一个HashMap,这个Hash的成员比较少时Redis为了节省内存会采用相似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
应用场景:假设有多个用户及对应的用户信息,能够用来存储以用户ID为key,将用户信息序列化为好比json格式作为value进行保存。
[root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> hset hash1 key1 value1 ##设置键值hash1,而且指定内部key与value对应 (integer) 1 192.168.100.101:6379> hget hash1 key1 ##查看hash1中的key1的值 "value1" 192.168.100.101:6379> hexists hash1 key1 ##检查hash1中是否有key1 (integer) 1 192.168.100.101:6379> hset hash1 key2 value2 ##在hash1中建立key2 (integer) 1 192.168.100.101:6379> hlen hash1 ##查看hash1中键值的基数 (integer) 2 192.168.100.101:6379> hkeys hash1 ##查看hash1中具体包含的键 1) "key1" 2) "key2" 192.168.100.101:6379> hvals hash1 ##查看hash1中具体包含的值 1) "value1" 2) "value2" 192.168.100.101:6379> hmget hash1 key1 key2 ##经过明确指定hash1中的key,去查看值是什么 1) "value1" 2) "value2" 192.168.100.101:6379> hgetall hash1 ##查看hash1中包含的全部键和值的对应 1) "key1" 2) "value1" 3) "key2" 4) "value2" 192.168.100.101:6379> hset hash1 key4 10 ##添加新键key4,值为整数10 (integer) 1 192.168.100.101:6379> hincrby hash1 key4 15 ##将key4执行计算加10(仅限整数) (integer) 25 192.168.100.101:6379> hmset hash1 key5 value5 key6 value6 key7 value7 ##批量添加键值对 OK 192.168.100.101:6379> hgetall hash1 ##验证批量添加的键值对 1) "key1" 2) "value1" 3) "key2" 4) "value2" 5) "key3" 6) "value3" 7) "key4" 8) "25" 9) "key5" 10) "value5" 11) "key6" 12) "value6" 13) "key7" 14) "value7" Redis中操做之其余操做; [root@redis ~]# redis -h 192.168.100.101 -p 6379 -a 123123 192.168.100.101:6379> dbsize ##查看全部key的数目 192.168.100.101:6379> flushdb ##删除当前选择数据库中的全部key 192.168.100.101:6379> flushall ##删除全部数据库中的全部key 192.168.100.101:6379> save ##将数据同步保存到磁盘 192.168.100.101:6379> bgsave ##异步保存 192.168.100.101:6379> lastsave ##上次成功保存到磁盘的Unix时间戳 192.168.100.101:6379> info ##查询server信息 192.168.100.101:6379> slaveof ##改变复制策略设置