zoukankan      html  css  js  c++  java
  • 新人入坑Redis必会的吐血总结

    新人入坑Redis必会的吐血总结

    一、什么是Redis

    Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map。简单来讲,Redis是一种NOSQL内存数据库,小伙伴们可不要把它理解为NO SQL(不是SQL),它的全称是Not Only SQL(不仅仅是SQL),换个层面来讲,它是一种非关系型的数据库,它是作为关系型数据库的良好补充,它与传统的MySQL,Oracle不同之处在于,它是通过在内存中读写数据,大大提高了读写速度。可以说,Redis是为了解决网站高并发、高可用、高可扩展、大数据存储等一系列问题而产生的数据库解决方案,不可或缺的一部分。

    它具有以下特点:

    1、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    2、Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list、set、sortedset、hash等数据结构的存储。
    3、Redis支持数据的备份,即master-slave模式的数据备份。

    Redis有五种键值类型:

    • String字符类型

    • hash散列类型

    • list列表类型

    • set集合类型

    • sortedset有序集合类型

    而本文将基于Redis5.0为例来介绍Redis一些相关命令的使用和踩过的坑

    二、关于Redis的安装与启动

    环境准备

    安装教程请参看这里:https://www.cnblogs.com/ECJTUACM-873284962/p/9532043.html

    在线环境

    官网似乎提供了一个在线的Redis平台,链接在这里:http://try.redis.io/

    Redis启动

    前端启动

    按照我所提供的教程安装以后,我们只需要输入命令redis-server即可,界面如下:

    5b835b1b0014c

    前端停止启动
    • 强制关闭:Ctrl+c

    • 正常关闭[root@sakura]# redis-cli shutdown

    后端启动

    因为Redis在实际使用中不会只是一个Redis单独工作,启动和关闭方式中的ip地址和端口号可以在配置文件中自行修改,下面会有修改方式.

    启动方式

    1. 需要将redis解压之后的源码包中的redis.conf文件拷贝到bin目录下.直接复制粘贴即可

    2. 修改redis.conf文件,将daemonize改为yes(vi redis.conf进去,:/daemonize搜索).

    3. 使用命令后端启动redis.命令行redis-server redis.conf(以配置文件启动)

    4. 查看是否启动成功.命令行 ps -aux | grep redis (直接查看redis的进程)

    如果你之前按照我所提供的教程修改过,这一过程可以直接忽略就好

    5b8361847bc1e

    关闭方式

    • 强制关闭:kill -9 PID

    • 正常关闭:redis-cli -h ip地址 -p 端口号(默认端口号是6379) shutdown

    在项目中,建议使用正常关闭。 因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭,则会将内存数据持久化到本地之后,再关闭。如果是强制关闭,则不会进行持久化操作,可能会造成部分数据的丢失。

    Redis客户端启动

    启动客户端命令:[root@sakura]# redis-cli -h ip地址 -p 端口号

    由于默认IP是127.0.0.1,端口是6379,我们只需要输入命令redis-cli即可

    退出:127.0.0.1:6379> quit即可

    三、Redis数据类型及常用命令讲解

    1、Redis-String

    string使用环境:主要用于保存json格式的字符串

    赋值

    set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回"OK",如果赋予相同的key,新的value会覆盖老的value

    example:

    127.0.0.1:6379> set username zhangsan
    OK
    
    取值

    get key:获取key的value。如果与该key关联的value不是string类型,redis将返回错误信息,因为get命令只能用于获取string value;如果该key不存在,返回nil

    example:

    127.0.0.1:6379> get username
    "zhangsan"
    
    删除

    del key:删除指定key,返回值是数字类型,表示删了几条数据

    example:

    127.0.0.1:6379> del username
    (integer) 1
    
    扩展

    getset key value:先获取该key的值,然后再设置该key的值

    example:

    127.0.0.1:6379> getset username zhangsan
    (nil)
    127.0.0.1:6379> keys *
    1) "username"
    127.0.0.1:6379> get username
    "zhangsan"
    

    incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后的值为1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于++(作用:统计网站访客人数,当计数器)

    example:

    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> incr age
    (integer) 19
    

    decr key:将指定的key的value原子性的递减1,如果该key不存在,其初始值为0,在incr之后的值为-1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,相当于--i

    example:

    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> decr age
    (integer) 17
    

    append key value:拼接字符串,如果该key存在,则在原有的value后追加该值,如果该key不存在,则重新创建一个key/value

    example:

    127.0.0.1:6379> set information hel
    OK
    127.0.0.1:6379> append information lo
    (integer) 5
    127.0.0.1:6379> get information
    "hello"
    

    incrby和decrby:只能对字符串是数字的进行操作,incrby key value是对原有的key的值增加value,而decrby key value是对原有的key的值减少value

    example:

    127.0.0.1:6379> get age
    "17"
    127.0.0.1:6379> incrby age 10
    (integer) 27
    127.0.0.1:6379> decrby age 10
    (integer) 17
    127.0.0.1:6379> get information
    "hello"
    127.0.0.1:6379> incrby information 10
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> decrby information 10
    (error) ERR value is not an integer or out of range
    

    2、Redis-hash

    Redis中的hash类型可以看成具有string key和string value的map容器,所以该类型非常适合于存储值对象的信息。如username,password和age等。如果hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个hash可以存储4294967295个键值对。

    hash特点:占用的磁盘空间极少

    赋值:

    hset key field value:为指定的key设定field/value对(键值对)

    example:

    127.0.0.1:6379> hset key1 field1 123
    (integer) 1
    

    hmset key field value[field2 value2...]:设置key中的多个field/value

    example:

    127.0.0.1:6379> hmset aaa name kitty age 20
    OK
    
    取值:

    hget key filed:获取指定的key的field的值

    example:

    127.0.0.1:6379> hget key1 field1
    "123"
    

    hmget key filed1 field2...:获取key中的多个field的值

    example:

    127.0.0.1:6379> hmget aaa name age
    1) "kitty"
    2) "20"
    

    hgetall key:获取key中的所有field-value2

    example:

    127.0.0.1:6379> hgetall aaa
    1) "name"
    2) "kitty"
    3) "age"
    4) "20"
    
    删除

    hdel key field[field...]:可以删除一个或多个字段,返回值是被删除的字段个数

    example:

    127.0.0.1:6379> hdel key1 field1
    (integer) 1
    

    del key:删除整个list

    example:

    127.0.0.1:6379> del aaa
    (integer) 1
    
    增加数字

    hincrby key field increment:设置key中的field增加increment,如age增加20

    example:

    127.0.0.1:6379> hmset aaa name kitty age 20
    OK
    127.0.0.1:6379> hincrby aaa age 20
    (integer) 40
    
    扩展命令

    hexists key field:判断指定的key中的field是否存在

    example:

    127.0.0.1:6379> hexists aaa name
    (integer) 1
    127.0.0.1:6379> hexists aaa aaaa
    (integer) 0
    

    hlen key:获取key所包含的field的数量

    example:

    127.0.0.1:6379> hlen aaa
    (integer) 2
    

    hkeys key:获得所有的字段

    example:

    127.0.0.1:6379> hkeys aaa
    1) "name"
    2) "age"
    

    3、Redis-list

    Redis中list选取的是链表,因为在Redis操作中,最多的操作是进行元素的增删

    赋值

    lpush key value [value1 value2 ...] 在指定的key所关联的list头部插入所有的value,如果该key不存在,该命令在插入之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据,插入成功,返回元素的个数。

    example:

    127.0.0.1:6379> lpush score1 1 2 3 4 5
    (integer) 5
    

    rpush key value [value1 value2 ...] 在该list的尾部添加元素

    example:

    127.0.0.1:6379> rpush score2 1 2 3 4 5
    (integer) 5
    
    取值

    lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可以为负数,若为-1则表示链表尾部的元素,-2表示倒数第二个,以此类推...

    example:

    127.0.0.1:6379> lrange score1 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    127.0.0.1:6379> lrange score2 0 -1
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    
    删值

    lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素

    example:

    127.0.0.1:6379> lpop score1
    "5"
    127.0.0.1:6379> lpop score2
    "1"
    

    rpop key:从尾部弹出元素

    example:

    127.0.0.1:6379> rpop score1
    "1"
    127.0.0.1:6379> rpop score2
    "5"
    
    扩展

    llen key:返回指定的key关联的链表中的元素的数量

    example:

    127.0.0.1:6379> llen score1
    (integer) 3
    127.0.0.1:6379> llen score2
    (integer) 3
    

    lrem key count value:删除count个值为value的元素,如果count大于0,从头到尾遍历并删除count个值为value的元素,如果count小于0,则从尾到头遍历并删除,如果count等于0,则删除链表中所有等于value的元素。

    example:

    127.0.0.1:6379> lrem score1 1 2
    (integer) 1
    127.0.0.1:6379> lrem score2 1 2
    (integer) 1
    
    通过索引替换

    lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛出异常

    example:

    127.0.0.1:6379> lset score1 0 1
    OK
    127.0.0.1:6379> lset score2 0 1
    OK
    
    在索引前/后插入元素

    linsert key before|after pivot value:在pivot元素前或者后插入value这个元素

    example:

    127.0.0.1:6379> linsert score1 before 3 aaa
    (integer) 3
    127.0.0.1:6379> lrange score1 0 -1
    1) "1"
    2) "aaa"
    3) "3"
    127.0.0.1:6379> linsert score1 after 3 bbb
    (integer) 4
    127.0.0.1:6379> lrange score1 0 -1
    1) "1"
    2) "aaa"
    3) "3"
    4) "bbb"
    

    rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。[循环操作]

    example:

    127.0.0.1:6379> lrange score1 0 -1
    1) "1"
    2) "aaa"
    3) "3"
    127.0.0.1:6379> lrange score2 0 -1
    1) "bbb"
    2) "1"
    3) "4"
    127.0.0.1:6379> rpoplpush score1 score2
    "3"
    127.0.0.1:6379> lrange score1 0 -1
    1) "1"
    2) "aaa"
    127.0.0.1:6379> lrange score2 0 -1
    1) "3"
    2) "bbb"
    3) "1"
    4) "4"
    

    4、Redis-set

    赋值

    sadd key value[value1 value2...]:向set中添加元素,如果该key的值已有则不会重复添加

    example:

    127.0.0.1:6379> sadd abc 1 2 3 4
    (integer) 4
    

    srem key member[member1 member2...]:删除set中指定的成员

    example:

    127.0.0.1:6379> srem abc 1 3
    (integer) 2
    
    取值

    smembers key:获取set中所有的成员

    example:

    127.0.0.1:6379> smembers abc
    1) "2"
    2) "4"
    

    sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在(无论集合中有多少元素都可以极速的返回结果)

    example:

    127.0.0.1:6379> sismember abc 2
    (integer) 1
    127.0.0.1:6379> sismember abc 3
    (integer) 0
    
    删值

    集合运算

    差集运算

    sdiff key1 key2...:返回key1与key2中相差的成员,而且与key的顺序有关,即返回差集

    example:

    127.0.0.1:6379> sadd set1 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> sadd set2 3 4 5 6 7
    (integer) 5
    127.0.0.1:6379> sdiff set1 set2
    1) "1"
    2) "2"
    127.0.0.1:6379> sdiff set2 set1
    1) "6"
    2) "7"
    

    交集运算

    sinter key1 key2...:返回交集

    example:

    127.0.0.1:6379> sinter set1 set2
    1) "3"
    2) "4"
    3) "5"
    

    并集运算

    sunion key1 key2...:返回并集

    example:

    127.0.0.1:6379> sunion set1 set2
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "6"
    7) "7"
    
    扩展命令

    scard key:获取set中成员的数量

    example:

    127.0.0.1:6379> scard set1
    (integer) 5
    

    srandmember key:随机返回set中的一个成员

    example:

    127.0.0.1:6379> srandmember set1
    "1"
    127.0.0.1:6379> srandmember set1
    "5"
    127.0.0.1:6379> srandmember set1
    "3"
    

    sdiffstore destination key1 key2...:将key1 key2...相差的成员存储在destination上

    example:

    127.0.0.1:6379> sdiffstore set3 set1 set2
    (integer) 2
    127.0.0.1:6379> smembers set3
    1) "1"
    2) "2"
    

    sinterstore destination key[key...]:将返回的交集存储在destination上

    example:

    127.0.0.1:6379> sinterstore set4 set1 set2
    (integer) 3
    127.0.0.1:6379> smembers set4
    1) "3"
    2) "4"
    3) "5"
    

    5、Redis-sortedset

    赋值

    zadd key score member score2 member2...:将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数代替原有的分数,返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。

    example:

    127.0.0.1:6379> zadd list 50 xiaoming 100 xiaohong 200 xiaozhang
    (integer) 3
    
    取值

    zscore key member:返回指定成员的分数

    example:

    127.0.0.1:6379> zscore list xiaohong
    "100"
    

    zcard key:获取集合中的成员数量

    example:

    127.0.0.1:6379> zcard list
    (integer) 3
    
    范围查询

    zrange key start end[withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数(分数从小到大排序)

    example:

    127.0.0.1:6379> zrange list 0 -1
    1) "xiaoming"
    2) "xiaohong"
    3) "xiaozhang"
    127.0.0.1:6379> zrange list 0 -1 withscores
    1) "xiaoming"
    2) "50"
    3) "xiaohong"
    4) "100"
    5) "xiaozhang"
    6) "200"
    

    zrevrange key start end[withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数(分数从大到小排序)

    example:

    127.0.0.1:6379> zrevrange list 0 -1
    1) "xiaozhang"
    2) "xiaohong"
    3) "xiaoming"
    127.0.0.1:6379> zrevrange list 0 -1 withscores
    1) "xiaozhang"
    2) "200"
    3) "xiaohong"
    4) "100"
    5) "xiaoming"
    6) "50"
    
    删值

    zrem key member[member...]:移除集合中指定的成员,可以指定多个成员

    example:

    127.0.0.1:6379> zrem list xiaozhang
    (integer) 1
    

    zremrangebyrank key start stop:按照排名范围删除元素

    example:

    127.0.0.1:6379> zremrangebyrank list 0 1
    (integer) 2
    

    zremrangebyscore key min max:按照分数范围删除元素

    example:

    127.0.0.1:6379> zremrangebyscore list 50 120
    (integer) 2
    
    扩展命令

    zrangebyscore key min max [withscores][LIMIT offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[LIMIT offset count]:offset,表明从脚标为offset的元素开始并返回count个成员

    example:

    127.0.0.1:6379> zrangebyscore list 50 120 withscores limit 0 2
    1) "xiaoming"
    2) "50"
    3) "xiaohong"
    4) "100"
    

    zincrby key increment member:设置指定成员的增加的分数,返回值是更改后的分数

    example:

    127.0.0.1:6379> zincrby list 30 xiaoming
    "80"
    

    zcount key min max:获取分数在[min,max]之间的成员

    example:

    127.0.0.1:6379> zcount list 80 120
    (integer) 2
    

    zrank key member:返回成员在集合中的排名(索引从小到大)

    example:

    127.0.0.1:6379> zrank list xiaohong
    (integer) 1
    

    zrevrank key member:返回成员在集合中的排名。(索引从大到小)

    example:

    127.0.0.1:6379> zrevrank list xiaozhang
    (integer) 0
    

    6、通用Redis命令【重点】

    keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或者多个字符

    通配符:

    • *表示任意0个或者多个字符

    • ?表示任意一个字符

    exits key:判断该key是否存在,1表示存在,0表示不存在

    example:

    127.0.0.1:6379> exists username
    (integer) 1
    127.0.0.1:6379> exists admin
    (integer) 0
    

    rename key newkey:为当前的key重命名

    127.0.0.1:6379> rename username user
    OK
    127.0.0.1:6379> keys *
     1) "list"
     2) "abc"
     3) "set1"
     4) "information"
     5) "set2"
     6) "age"
     7) "score2"
     8) "set4"
     9) "score1"
    10) "set3"
    11) "user"
    

    type key:获取指定的key的值类型,该命令将以字符串的格式返回。返回的字符串为string、list、set、hash和zset,
    如果key不存在返回none

    example:

    127.0.0.1:6379> type user
    string
    127.0.0.1:6379> type list
    zset
    

    expire key:设置过期时间,单位:秒 如果某个key过期,redis会将其删除

    example:

    127.0.0.1:6379> expire abc 10
    (integer) 1
    127.0.0.1:6379> keys *
     1) "list"
     2) "set1"
     3) "information"
     4) "set2"
     5) "age"
     6) "score2"
     7) "set4"
     8) "score1"
     9) "set3"
    10) "user"
    

    ttl key:获取该key所剩的超时时间,如果没有设置超时时间,返回-1.如果返回-2表示超时不存在。

    example:

    127.0.0.1:6379> expire user 10
    (integer) 1
    127.0.0.1:6379> ttl user
    (integer) 3
    127.0.0.1:6379> ttl user
    (integer) -2
    127.0.0.1:6379> keys *
    1) "list"
    2) "set1"
    3) "information"
    4) "set2"
    5) "age"
    6) "score2"
    7) "set4"
    8) "score1"
    9) "set3"
    127.0.0.1:6379> ttl information
    (integer) -1
    

    7、Redis其他特性

    消息订阅与发布

    subscribe channel:订阅频道

    example:

    127.0.0.1:6379> subscribe mychat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "mychat"
    3) (integer) 1
    

    psubscribe channel*:批量订阅频道

    example:

    127.0.0.1:6379> psubscribe s*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "s*"
    3) (integer) 1
    

    publish channel content:在指定的频道中发布消息

    example:

    127.0.0.1:6379> publish mychat 'today is a newday'
    (integer) 1
    
    多数据库

    传统数据库如MySQL数据库可以自己用语句自定义创建,我们可以通过create database xxxx进行创建。Redis 也是有数据库的,不过Redis已经提前创建好了。在redis默认有十六个数据库,0,1,2....15,在radis上所作的所有数据操作,都是默认在0号数据库上操作,数据库与数据库之间是不能共享键值对的。我们可以把Redis数据库理解为一个map集合。

    切换数据库

    select 数据库名:切换数据库

    example:

    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> select 15
    OK
    127.0.0.1:6379[15]> select 16
    (error) ERR DB index is out of range
    
    数据库的移植

    move newkey 数据库名:将当前数据库的key移植到指定的数据库中

    example:

    127.0.0.1:6379> keys *
    1) "list"
    2) "set1"
    3) "information"
    4) "set2"
    5) "age"
    6) "score2"
    7) "set4"
    8) "score1"
    9) "set3"
    127.0.0.1:6379> move information 1
    (integer) 1
    127.0.0.1:6379> keys *
    1) "list"
    2) "set1"
    3) "set2"
    4) "age"
    5) "score2"
    6) "set4"
    7) "score1"
    8) "set3"
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> keys *
    1) "information"
    
    数据库清空

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

    flushall 删除所有数据库中的所有key

    服务器命令

    ping 测试连接是否存活

    example:

    127.0.0.1:6379> ping
    PONG
    

    echo 在命令行打印一些内容

    example:

    127.0.0.1:6379> echo hehe
    "hehe"
    

    quit/Ctrl+C 退出客户端

    example:

    127.0.0.1:6379> quit
    

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

    example:

    127.0.0.1:6379> dbsize
    (integer) 8
    

    info 获取服务器的信息和统计

    example:

    127.0.0.1:6379> info
    # Server
    redis_version:4.9.103
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:d727e4f6fe88cefd
    redis_mode:standalone
    ......
    ......
    

    8、Redis持久化策略

    RDB策略

    RDB是redis的默认持久化机制,相当于照快照,保存的是一种状态

    优点:

    • 快照速度极快,还原数据速度极快

    • 适用于灾难备份

    缺点:

    • 小内存机器不适合使用

    RDB机制符合要求就会照快照(随时随地启动),会占用一定的系统资源(突然的)很可能内存不足直接宕机。(宕机后,服务器会关闭,属于非正常关闭,数据会丢失)

    RDB机制适用于内存比较充裕的计算机

    RDB是何时进行照快照?

    • 服务器正常关闭时,会照一次快照

    • key满足一定条件时,会照一次快照

      • save 900 1#每900秒至少有1个key发生变化,则dump内存快照

      • save 300 10#每300秒至少有10个key发生变化,则dump内存快照

      • save 60 10000#每60秒至少有10000个key发生变化,则dump内存快照

    AOF策略

    AOF策略是一种使用日志功能保存数据操作的机制,默认AOF机制关闭的,它的操作只会保存导致key变化的语句

    优点:

    • 持续性占用极少量的内存资源

    缺点:

    • 日志文件会特别大,不适用于灾难恢复

    • 恢复效率远远低于RDB

    AOF机制适用于内存比较小的计算机

    AOF是如何进行数据备份的呢?

    • 每秒同步:每秒进行一次AOF保存数据,安全性低,比较节省系统资源

    • 每修改同步:只要有key变化语句,就进行AOF保存数据,比较安全,但是这样做极为浪费系统资源,降低效率

    • 不同步:不进行任何持久化操作,这种配置不安全

    AOF的配置

    • always #每秒有数据修改发生时都会写入AOF文件

    • everysec #每秒同步一次,该策略为AOF的缺省策略

    • no #从不同步。高效但是数据不会被持久化

    开启AOF机制的方法

    1. 在redis.config文件中用:/aof找到对应的段落

    2. 将appendonly no改成appendonly yes

    3. 再修改其中一段成appendfsync always即可

  • 相关阅读:
    记录一次无法很好解决的问题
    java与进制转换
    花了点时间写了下测试框架
    利用eclipse或者pycharm编写monkeyrunner脚本,cmd打开应用“转转”并截图保存到D盘
    Instrumentation
    关于学生机受控应用的问题总结
    忙里偷闲一天
    linux下python3的安装(已安装python2的情况下)
    ROS上利用usb_cam读取摄像头图像
    ch8 -- directMethod
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/9542496.html
Copyright © 2011-2022 走看看