zoukankan      html  css  js  c++  java
  • 第2讲 Redis常用命令与高级应用

    目录
    
    一、redis数据类型
        5. sorted sets类型和操作
    二、Redis常用命令
        1、键值相关命令
        2、服务器相关命令
    三、 redis高级应用
        1、 给redis服务器设置密码
        2、持久化
        3、主从备份
    

    一、redis数据类型

    5. sorted sets类型和操作

    sorted set是set的一个升级版本,它给集合中每个元素都定义一个分数,集合中的元素按照其分数排序。

    1) zadd 键 分数1 值1 [分数2 值2…]
    该命令添加指定的成员到key对应的有序集合中,每个成员都有一个分数。你可以指定多个分数/成员组合。如果一个指定的成员已经在对应的有序集合中了,那么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。分数的值必须是一个表示数字的字符串,并且可以是double类型的浮点数。

    127.0.0.1:6379>zadd zset1 1 lm 2 sc 3 glf
    (integer) 3
    127.0.0.1:6379>zadd zset1 1 ymj
    (integer) 1
    

    2) zrange 集合 起始下标 截止下标 [withscores]
    返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列。

    起始下标与截止下标和list类型一致:
    	0代表队列中第一个元素,1代表第二个元素,依次类推
    	-1代表队列中最后一个元素,-2代表倒数第二个元素
    
    withscores:返回集合中元素的同时,返回其分数(score)
    
    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "lm"
    2) "1"
    3) "ymj"
    4) "1"
    5) "sc"
    6) "2"
    7) "glf"
    8) "3"
    

    3) zrevrange 集合 起始下标 截止下标 [withscores]
    返回有序集合中,指定区间的成员。其成员按照score从大到小来排列。

    127.0.0.1:6379>zrevrange zset1 0 -1 withscores
    1) "glf"		//下标为0
    2) "3"
    3) "sc"			//下标为1
    4) "2"
    5) "ymj"		//下标为2
    6) "1"
    7) "lm"			//下标为3
    8) "1"
    
    127.0.0.1:6379>zrevrange zset1 1 2 withscores		//查看集合中下标是1-2的值
    1) "sc"
    2) "2"
    3) "ymj"
    4) "1"
    

    4) zrangebyscore 集合 起始分数 截止分数 withscores(不包含截止分数)
    返回有序集合中score(分数)在指定区间的值

    127.0.0.1:6379>zadd zset2 1 one 2 two 3 three 4 four
    (integer) 4
    127.0.0.1:6379>zrange zset2 0 -1 withscores		//按照下标区间返回值
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    7) "four"
    8) "4"
    
    127.0.0.1:6379>zrangebyscore zset2 2 3 withscores	//按照分数区间返回值
    1) "two"
    2) "2"
    3) "three"
    4) "3"
    

    5) zrem 集合 值1 [值2…]
    删除有序集合中指定的值

    127.0.0.1:6379>zrem zset1 lm
    (integer) 1
    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "ymj"
    2) "1"
    3) "sc"
    4) "2"
    5) "glf"
    6) "3"
    

    6) zincrby 集合 增量 值
    给有序集合中指定值的成员的分数(score)值加上增量(increment)。如果集合中没有这个值,则给添加一个分数是increment的值。

    127.0.0.1:6379>zincrby zset1 2 ymj		//如果值存在,则在其分数上加增量
    "3"
    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "sc"
    2) "2"
    3) "glf"
    4) "3"
    5) "ymj"
    6) "3"
    
    127.0.0.1:6379>zincrby zset1 4 bro		//如果值不存在,则加入值。并指定分数为增"4"										量
    
    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "sc"
    2) "2"
    3) "glf"
    4) "3"
    5) "ymj"
    6) "3"
    7) "bro"
    8) "4"
    

    7) zrank 集合 值
    返回有序集合中指定值的下标。

    127.0.0.1:6379>zrank zset1 sc
    (integer) 0
    127.0.0.1:6379>zrank zset1 ymj
    (integer) 2
    

    8) zrevrank 集合 值
    返回有序集合中指定值的下标

    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "sc"
    2) "2"
    3) "glf"
    4) "3"
    5) "ymj"
    6) "3"
    7) "bro"
    8) "4"
    127.0.0.1:6379>zrevrank zset1 ymj
    (integer) 1
    127.0.0.1:6379>zrevrank zset1 sc
    (integer) 3
    

    9) zcount 集合 起始分数 截止分数
    返回有序集合中,score值在起始分数与截止分数之间的个数

    127.0.0.1:6379>zrange zset2 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    7) "four"
    8) "4"
    
    127.0.0.1:6379>zcount zset2 2 4
    (integer) 3
    

    10) zcard 集合
    返回有序集合元素的个数

    127.0.0.1:6379>zcard zset2
    (integer) 4
    

    11) zremrangebyrank 集合 起始下标 结束下标
    删除有序集合中,下标在指定区间的元素

    127.0.0.1:6379>zrange zset2 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    7) "four"
    8) "4"
    127.0.0.1:6379> ZREMRANGEBYRANK zset2 0 1
    (integer) 2
    127.0.0.1:6379>zrange zset2 0 -1 withscores
    1) "three"
    2) "3"
    3) "four"
    4) "4"
    

    12) zremrangebyscore 集合 起始分数 截止分数
    删除有序集合中,分数在指定区间的元素

    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "sc"
    2) "2"
    3) "glf"
    4) "3"
    5) "ymj"
    6) "3"
    7) "bro"
    8) "4"
    127.0.0.1:6379> ZREMRANGEBYSCORE zset1 2 3 
    (integer) 3
    127.0.0.1:6379>zrange zset1 0 -1 withscores
    1) "bro"
    2) "4"
    

    13)zinterstore 新集合 取交集的集合个数 集合1 集合2
    取集合1和集合2的交集,并把结果保存到新集合中。在计算交集之前,需要指定计算交集的集合的个数。交集中,值的分数是多个集合中分数的和。

    127.0.0.1:6379>zadd zset1 1 one 2 two 3 three 4 four
    (integer) 4
    127.0.0.1:6379>zaddzset2  2 two 3 three 4 four 5 five
    (integer) 4
    127.0.0.1:6379> ZINTERSTORE zset3 2 zset1 zset2 	
    //有两个集合计算交集,所以集合个数是2
    (integer) 3
    127.0.0.1:6379> ZRANGE zset3 0 -1 withscores
    1) "two"
    2) "4"				//分数是两个集合中two值的分数和
    3) "three"
    4) "6"
    5) "four"
    6) "8"
    

    14) zunionstore 新集合 取并集的集合个数 集合1 集合2
    取集合1和集合2的并集,并把结果保存到新集合中。在计算并集之前,需要指定计算并集的集合的个数。并集中,值的分数是多个集合中分数的和。

    127.0.0.1:6379>zadd zset1 1 one 2 two 3 three 4 four
    (integer) 4
    127.0.0.1:6379>zaddzset2  2 two 3 three 4 four 5 five
    (integer) 4
    127.0.0.1:6379> ZUNIONSTORE zset4 2 zset1 zset2
    (integer) 5
    127.0.0.1:6379> ZRANGE zset4 0 -1 withscores
     1) "one"
     2) "1"
     3) "two"
     4) "4"
     5) "five"
     6) "5"
     7) "three"
     8) "6"
     9) "four"
    10) "8"
    

    二、Redis常用命令

    (一) 键值相关命令

    1、 keys 键名
    按照键名查找指定的键。支持通配符

    127.0.0.1:6379> set hello 1
    OK
    127.0.0.1:6379> set hallo 1
    OK
    127.0.0.1:6379> set heeeello 1
    OK
    127.0.0.1:6379> keys h?llo
    1) "hallo"
    2) "hello"
    127.0.0.1:6379> keys h*llo
    1) "hallo"
    2) "heeeello"
    3) "hello"
    

    2、 exists 键名
    确认一个键是否存在

    127.0.0.1:6379> EXISTS name
    (integer) 1						//name键存在
    127.0.0.1:6379> EXISTS age
    (integer) 0						//age键不存在
    

    3、 del 键名
    删除一个键

    127.0.0.1:6379>del hello
    (integer) 1
    127.0.0.1:6379> EXISTS hello
    (integer) 0
    

    4、 expire 键 秒
    设置一个键的过期时间,如果键已经过期,将会被自动删除

    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> EXPIRE age 20
    (integer) 1
    127.0.0.1:6379>ttl age
    (integer) 18
    127.0.0.1:6379>ttl age
    (integer) -2
    127.0.0.1:6379> EXISTS age
    (integer) 0
    

    5、 ttl 键
    以秒为单位,返回键的剩余生存时间。
    当键不存在时,返回值为-2
    当键存在,但没有设置剩余生存时间时,返回-1

    127.0.0.1:6379>ttl name
    (integer) -1
    

    6、 select 数据库号
    选择一个数据库。
    默认连接的数据库是0,可以支持共16个数据库。
    在配置文件中,通过databases 16 关键字定义

    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]>
    

    7、 move 键 数据库号
    将当前数据库的键移动到指定的数据空中

    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> move age 1
    (integer) 1
    127.0.0.1:6379> get age
    (nil)
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> get age
    "18"	
    

    8、 randomkey
    从当前数据库返回一个随机的键。如果当前库没有任何键,则返回nil

    9、 rename 旧名 新名
    重命名键

    127.0.0.1:6379> rename name name_new
    OK
    127.0.0.1:6379> get name_new
    "sc"
    

    10、 type 键
    返回键类型。

    返回值
    none (key不存在)
    string (字符串)
    list (列表)
    set (集合)
    zset (有序集)
    hash (哈希表)

    (二) 服务器相关命令

    1、 ping
    测试服务器是否可以连接

    127.0.0.1:6379> ping
    PONG					//连接正常
    127.0.0.1:6379> ping
    Could not connect to Redis at 127.0.0.1:6379: Connection refused
    //redis被停止,连接拒绝
    

    2、 echo 字符串
    在命令行输出字符串

    127.0.0.1:6379> echo "test message"
    "test message"
    

    3、 quit
    退出redis数据库

    4、 save
    保存所有的数据。很少在生产环境直接使用SAVE 命令,因为它会阻塞所有的客户端的请求,可以使用BGSAVE命令代替. 如果在BGSAVE命令的保存数据的子进程发生错误的时,用SAVE命令保存最新的数据是最后的手段

    5、 dbsize
    返回当前库中键的数量

    127.0.0.1:6379>dbsize
    (integer) 6
    

    6、 info
    获取服务器的详细信息

    7、 config get 参数
    获取redis服务器配置文件中的参数。支持通配符

    127.0.0.1:6379>config get *			//查询配置文件中所有的参数
     1) "dbfilename"
     2) "dump.rdb"
    45) "port"
    46) "6379"
    99) "save"
    100) "900 1 300 10 60 10000"
    

    8、 flushdb
    删除当前数据库中所有的数据

    127.0.0.1:6379>dbsize
    (integer) 6
    127.0.0.1:6379>flushdb
    OK
    127.0.0.1:6379>dbsize
    (integer) 0
    

    9、 flushall
    删除所有数据库中所有的数据

    三、 redis高级应用

    1、 给redis服务器设置密码

    1)修改redis服务器的配置文件

    [root@localhostredis]# vi /usr/local/redis/etc/redis.conf
    # requirepass foobared					(大概391行)
    #找到这句话,requirepass后面就是登录redis的密码,改为自定义密码
    requirepass flzx_3QC
    

    2)重启redis

    [root@localhostredis]# pkill redis
    [root@localhostredis]#/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
    

    3)连接redis

    [root@localhostredis]# /usr/local/redis/bin/redis-cli 
    127.0.0.1:6379> keys *						//可以正常连接redis
    (error) NOAUTH Authentication required.		//但因为没有密码,提示操作拒绝
    
    127.0.0.1:6379>auth flzx_3QC				//利用auth命令输入密码
    OK
    
    127.0.0.1:6379> keys *						//才可以正常使用
    1) "name"
    

    [root@localhostredis]# /usr/local/redis/bin/redis-cli -a flzx_3QC
    #在登录的同时指定密码
    #注意历史命令中会明文保存此密码
    127.0.0.1:6379> keys *
    1) "name"
    

    2、持久化

    Redis 提供了不同级别的持久化方式:

    1)RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照 snapshotting(快照)。

    save 900 1		
    #900秒内,最少有1个键被改动。则自动保存一次数据集
    save 300 10
    #300秒内,最少有10个键被改动。则自动保存一次数据集
    save 60 10000
    #60秒内,最少有10000个键被改动。则自动保存一次数据集
    

    实验:验证dump.rdb数据保存文件

    [root@localhost ~]# ls
    anaconda-ks.cfg dump.rdb  install.log  install.log .syslog
    #root目录下有dump.rdb文件
    [root@localhost ~]# /usr/local/redis/bin/redis-server  /usr/local/redis/etc/redis.conf
    #在root目录中启动redis
    [root@localhost ~]# /usr/local/redis/bin/redis-cli 
    127.0.0.1:6379>auth 123
    OK
    127.0.0.1:6379> keys *
    1) "name2"
    2) "name"
    3) "name1"
    #0库中有键
    
    [root@localhost ~]# cd /usr/local/redis/
    [root@localhostredis]# pkill -9 redis
    [root@localhostredis]# /usr/local/redis/bin/redis-server  /usr/local/redis/etc/redis.conf
    #在/usr/local/redis/库中重启redis
    [root@localhostredis]# ls
    [root@localhostredis]# /usr/local/redis/bin/redis-cli 
    127.0.0.1:6379> keys *
    (empty list or set)
    #0库中没有键
    127.0.0.1:6379> save
    OK
    #保存
    127.0.0.1:6379> quit
    [root@localhostredis]# ls
    bin  dump.rdbetc
    #在redis目录中也生成dump.rdb文件
    

    结论:

    [root@localhostredis]# vi /usr/local/redis/etc/redis.conf
    dir ./
    #定义了dump.rdb数据库文件保存在当前位置。所以每次重启redis服务的所在位置不同,导致生成新的dump.rdb文件
    
    #将数据库保存目录写为绝对路径(注意只能是目录)
    dir /usr/local/redis/
    

    2) 使用AOF 会让你的Redis更加耐久: 你可以使用不同的持久化策略:无备份,每秒备份,每次写的时候备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。

    appendonly no
    #默认不使用AOF持久化(450行)
    
    appendonly yes
    #开启AOF持久化
    # appendfsync always		#有写操作,就马上写入磁盘。效率最慢,最安全
    appendfsync everysec		#默认,每秒钟写入磁盘一次。
    # appendfsync no			#不进行AOF备份,将数据交给操作系统处理。最快,最不安全
    

    3、主从备份

    Redis主从复制特点:

    a. Master可以拥有多个slave
    b. 多个slave可以连接同一个master外,还可以连接到其它slave
    c. 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
    d. 提高系统的伸缩性

    Redis主从复制过程:

    a. Slave与master建立连接,发送sync同步命令
    b. Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
    c. 后台完成保存后,就将此文件发送给slave
    d. Slave将此文件保存到硬盘上

    1) 不同服务器配置主从

    A)克隆一台linux作为从服务器
    克隆机需要进行如下操作:
    	①	vi /etc/sysconfig/network-scripts/ifcfg-eth0
    		删除MAC地址行
        ②	rm  -rf  /etc/udev/rules.d/70-persistent-net.rules
    		删除网卡和MAC地址绑定文件
    	③	注意关闭防火墙和SELinux
    	④	重启动系统
    
    
    B)在从服务器上配置
    
    [root@localhost ~]# vi /usr/local/redis/etc/redis.conf
    # slaveof<masterip><masterport>
    #把此句开启,并指定主服务器ip和端口	(196行)
    
    masterauth flzx_3QC
    #设定主服务器密码
    
    C)重启从服务器上redis
    

    2) 同一台服务器实现主从配置

    这里我们以本机配置 1台Master + 1台Slave 为例子,其中:

    Master IP:127.0.0.1  PORT:6379
    Slave1 IP:127.0.0.1  PORT:63791
    
    A) 复制出从服务器目录
    
    [root@localhost ~]# cp -r /usr/local/redis/ /usr/local/redis-slave1
    
    B) 修改redis-slave1配置文件
    
    [root@localhost ~]# vi /usr/local/redis-slave1/etc/redis.conf
    pidfile /usr/local/redis-slave1/redis.pid
    #指定pid文件
    port 63791
    #指定端口号
    dir /usr/local/redis-slave1/
    #指定服务器目录
    slaveof 127.0.0.1 6379
    #指定主服务器IP和端口
    masterauth flzx_3QC
    #指定主服务器密码
    
    C) 启动服务
    
    /usr/local/redis-slave1/bin/redis-server /usr/local/redis-slave1/etc/redis.conf
    #启动从服务器,并调用从服务器配置文件
    
    [root@localhost ~]# netstat -tlun
    tcp0      0 :::6379                     :::*                        LISTEN      
    tcp 0      0 :::63791                    :::*                        LISTEN
    #验证两个端口是否都启动
    
    D)验证
    
    [root@localhost ~]# /usr/local/redis/bin/redis-cli -a flzx_3QC   
    #启动主服务器,并建立一个键
    127.0.0.1:6379> set bb 234
    OK
    127.0.0.1:6379> keys *
    1) "sex"
    2) "aa"
    3) "name"
    4) "age"
    5) "bb"
    
    [root@localhost ~]# /usr/local/redis-slave1/bin/redis-cli -a flzx_3QC -p 63791
    #启动从服务器,发现键已经同步
    127.0.0.1:63791> keys *
    1) "aa"
    2) "sex"
    3) "age"
    4) "name"
    5) "bb"
    

    参考资料:
    1.Redis http://redis.io
    2.Redis中文官方网站 http://www.redis.cn
    3.Redis 教程 | 菜鸟教程 http://www.runoob.com/redis/redis-tutorial.html

  • 相关阅读:
    《大道至简》第一章读后感
    第一次随笔,献给结束大一的自己
    altium designer(AD13)隐藏敷铜的方法
    win下如何生成 github ssh公钥 GIT
    怎么把实际路径是英文的文件夹显示中文名?
    Linux GRUB手动安装方法详解
    Altium designer 如何将2D PCB转换成3D
    C++ 谓词(predicate) 与 仿函数 ( functor (function object))
    重载信号函数,解决参数问题
    VS2017常用快快捷键
  • 原文地址:https://www.cnblogs.com/52fhy/p/5007490.html
Copyright © 2011-2022 走看看