Redis自查表

本文深入解析Redis的六种核心数据类型,包括字符串、哈希、列表、集合、有序集合及它们的命令操作,同时介绍了Redis的通用命令、持久化策略、事务处理和消息发布订阅机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 端口号:6379
1】前端启动 -- 无法进行集群部署
①进入redis目录,/usr/local/redis
②./bin/redis-server
③再开一个终端窗口,到redis目录下 /usr/local/redis
④输入 ./bin/redis-cli,启动客户端即可
    注:当redis部署在其他服务器上或者端口号不是6379时,
        需要安装以下格式输入:./bin/redis-cli -h 127.0.0.1 -p 6379
        密码登录:./bin/redis-cli -h 127.0.0.1 -p 6379 -a root
2】后端启动
①修改配置文件 daemonize no  改为  daemonize yes
  若想要外部连接,先把配置文件中的 bind 127.0.0.1 注释掉
        关闭保护模式 protected-mode yes 改为  protected-mode no
        或者
        开启密码登录 # requirepass foobared 改为 requirepass 你的密码
②输入:./bin/redis-server ./redis.conf  回车即启动
③输入:ps -ef|grep -i redis 查看redis相关进程
④集群版打开客户端:./redis01/redis-cli -h 127.0.0.1 -p 7001 -c

3】redis关闭
①kill -9 pid(进程ID)  --非正常关闭,不推荐
②./bin/redis-cli shutdown  --正常关闭方式

4】开放redis端口
--通过设置Linux的防火墙,开启6379端口,这个实在Linux命令下执行
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
--重新刷新防火墙
/etc/rc.d/init.d/iptables save
--或者关闭防火墙
service iptables close

5】数据类型
①redis使用的是键值对 保存数据 。 (Java中的map集合)
    key : 全部都是字符串
    value : 五种数据类型
        Ⅰ、字符串(String) 例:"小明,小红是好朋友"
        Ⅱ、Hash  例:{username:"张三",age:"18"}  类似于json,可以存储javabean
        Ⅲ、List  例:[1,2,3,4,5,6]  类似于Java中的LinkedList 链表  添加/删除效率极高
        Ⅳ、Set   例:['a','b','c','d']  类似于Java中的HashSet
        Ⅴ、有序的set集合(SortedSet) 例:[5000 'a', 1000 'b', 10 'c'] 
②key名:自定义
    key名不要过长,否则影响使用效率。因为在redis中,名字越长,搜索越靠后
    key名不要太短,最好是有意义的,见名知意。

③String命令:字符串类型是Redis中最为基础、常用的数据存储类型,字符串在Redis中是二进制安全的,
        这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可容纳的数据长度是512M
        
        与MySQL对比:
            Redis    二进制安全(服务器端只传递二进制数据,不进行编解码)        数据不安全
            MySQL   二进制不安全(服务器端传递二进制数据时编解码容易出乱码)    数据安全
        
        Ⅰ、赋值操作 
            set key value  例: set username lisi
            如果key值存在,value值进行覆盖,和Java的Map一致
        Ⅱ、取值操作
            get key        例:get username
            如果key值不存在,返回一个  (nil)
        Ⅲ、删除操作
            del key           例:del username  
            存在返回值,是数字类型,表示删了几条数据。如果没有key返回0
        Ⅳ、扩展
            getset key value : 先获取该key的值,然后再再设置该key的值
            
            incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后,其值为1。
                        如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,
                        相当于Java中的 ++i 。可以用作计数器
            decr key: 将指定的key的value原子性的递减1,其初始值为0,在decr之后其值为-1。
                        如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息,
                        相当于Java中的 --i 。
            incrby key increnment: 递增 increnment  例:incrby key 10  在当前key值上加10
            decrby key increnment: 递减 increnment  例:decrby key 10  在当前key值上减10
            incr 和 decr 只能针对数字进行操作,对字符串不可以
            append key value:拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value。
        Ⅵ、使用环境
            主要用于保存json格式的字符串
            
④hash命令
    Rides中的Hash类型可以看成具有String Key和String Value的map容器,所以该类型非常适合于存储键值对象的信息。如Username、Password和Age等。
    如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
    Hash特点:占用磁盘空间极少
    
    Ⅰ、赋值操作
        hset key field value    为指定的key设定field/value 对(键值对)    例:hset hash1 uname zhangsan
        hmset key field value [field2 value2 ... ]    设置key中的多个field/value  例:hmset hash2 uname zhangsan age 18 sex man
    
    Ⅱ、取值操作
        hget key field                返回指定的key中的field的值
        hmget key filed1 field2 ...    获取key中的多个field的值
        hgetall key                    获取key中所有的filed-value
    
    Ⅲ、删除操作 -- 如果没有字段,整个hash都清除
        hdel key field                删除指定的key的指定的字段
        del key                      删除整个hash
    
    Ⅳ、扩展
        hincrby key field increment 对某个key中的字段值进行增加操作(只能对value为数字的使用)
        hexists key field2            查询某个字段是否存在,若返回0,则不存在
        hlen key                     返回此key包含多少字段
        hkeys key                     获得所有字段名
        hvals key                    获得所有value值
        
⑤链表List
    redis中的List类似于Java中的LinkedList
    使用环境:做大数据集合的增删、任务队列
    
    Ⅰ、赋值操作
        lpush key values[value1 value2 ...] 在指定的key所关联的list的头部插入所有的values,
            如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。
            插入成功,返回元素的个数
        例:lpush list1 1 2 3 4 存放顺序是 4 3 2 1  也就是说,lpush是从左侧添加
        
        rpush key values[value1 value2 ...] 在该list的尾部添加元素
        例:rpush list1 1 2 3 4 存放顺序是 1 2 3 4    也就是说,rpush是从右侧添加
        
    Ⅱ、取值操作
        lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;
        也可为负数,若为-1.则表示链表尾部的元素,-2则表示倒数第二个,依次类推...
        例:查询所有元素  lrange list1 0 -1
            显示某几个元素  lrange list1 1 2
        
    Ⅲ、删除操作即弹出操作
        lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;
                    若key存在,则返回链表的头部元素。
        例:lpop list1 删除list1中的元素 4
        rpop key:从尾部弹出元素
        例:rpop list1 删除list1中的元素 1
        
        当链表元素都弹出之后,list1也不再存在
        
        del key:删除整个集合
    
    Ⅳ、扩展
        llen key:返回指定的key关联的链表中的元素数量
        例:llen list1  返回 2
        
        rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。【循环操作】
        例:#添加一个list1
                rpush list1 a b c d e f
            #要求把list1的d元素弹出,把元素插入list2的头部
                rpoplpush list1 list2
            #当所有元素都从list1中弹出至list2后,查询list1提示(empty list or set)
            
            ※循环列表操作
                rpoplpush list1 list1
    
        
        以下为不推荐系列:
        1)删除N个元素(效率不高,不推荐使用。效率不高的原因是因为先将所有元素加上索引再弹出)
        lrem key count value:删除count个 值为 value 的元素,
            如果count大于0,从头向尾遍历并删除count个值为value的元素,
            如果count小于0,从尾向头遍历并删除count个值为value的元素。
            如果count等于0,则删除链表中所有等于value的元素
        例:#添加一个list3
                rpush list3 a b c a b c d b e f
            #删除链表中所有的a元素
                lrem list3 0 a
            #删除链表中两个b元素,删除顺序是从头到尾删除
                lrem list3 2 b
            #删除链表中两个b元素,删除顺序是从尾到头删除
                lrem list3 -2 b
        
        2)通过索引替换元素:(效率不高,同样是因为赋索引操作)
        lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。
            操作链表的脚标,不存在则抛出异常。
        例:#添加一个list1
                rpush list1 a b c d a b c a d
            #想把下标为2的元素进行替换,即 c --> www
                lset list1 2 www
        
        3)在索引前/后插入元素:(效率不高,同样是因为赋索引操作)
        linsert key before|after pivot value:在pivot元素前或者后插入value元素
        例:#想在下标为2的元素www前,插入元素 qqq
                linsert list1 before www qqq
            #想在下标为2的元素www后,插入元素 ppp
                linsert list1 after www ppp
        
⑥-1无序的集合set
    与List集合不同的是,Set集合中不允许存在重复元素
    在Redis操作中,涉及到两个【大数据】集合的并集、交集、差集运算,都会依赖Set集合。
    
    Ⅰ、赋值操作
        sadd key values[value1 value2 ...] :向set中添加数据,如果该key的值已有则不会重复添加
        例:#向set1中添加数据
                sadd set1 a b c d a
        
    
    Ⅱ、取值操作
        smembers key :获取set中所有的成员
    
        sismember key member :判断参数中指定的成员是否在该set中,1表示存在,0表示不存在
                                或者该key本身就不存在。(无论集合中有多少元素都可以急速的返回结果)
        
    
    Ⅲ、删除操作
        srem key members[members1 members2 ...] :删除set中指定的成员
        例:从set1集合中删除元素 b d
                srem set1 b d
        del key
    
    Ⅳ、集合运算
        sadd set1 a b c d
        sadd set2 a b e f g
        1)差集运算
            sdiff key1 key2 ... :返回key1 与 key2 的差集
            例:#哪些元素属于set1,但不属于set2
                sdiff set1 set2
                
                #哪些元素属于set2,但不属于set1
                sdiff set2 set1
        
        2)交集运算
            sinter key1 key2 ... :返回key1 与 key2 的交集
            例:#哪些元素既属于set1,又属于set2
                sinter set1 set2

        3)并集计算
            sunion key1 key2 ... :返回key1 与 key2 的并集
            例:#哪些元素属于set1或者属于set2
                sunion set1 set2

    Ⅴ、扩展命令
        scard key :获取set中成员的数量
        
        srandmember key:随机返回set中的一个成员
        
        sdiffstore destination key1 key1 ... :将key1、key2相差的成员存储在destination(新的集合)上
        
        sinterstore destination key[key...] :将返回的交集存储在destination(新的集合)上
        
        sunionstore destination key[key...] :将返回的并集存储在destination(新的集合)上
            例:将set1和set2的并集存储在set3上
                sunionstore set3 set1 set2
    
    
⑥-2有序的Set集合
    有序的set集合,专门用来做排行榜
    
    Ⅰ、赋值操作
        zadd key score member score2 member2 ... :将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在,则会用新的分数替换原有的分数。
                                                    返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
                                                    默认从小到大排序。
        例:#向set1集合中添加三个元素
            zadd set1 5000 zhangsan 3000 lisi 1000 wangwu
        
    
    Ⅱ、取值操作
        zscore key member:返回指定成员的值
        例:从set1集合中获取zhangsan的值
            zscore set1 zhangsan
        
        zcard key:获取集合中的成员数量
        
        zrange key start end [withscores]:(范围查询)获取集合中脚标为start-end的成员,[withscores]参数表面返回的成员包含其分数。此为从小到大排序
        例:#从set1中查询所有元素
            zrange set1 0 -1
            #从set1中查询所有元素并带其值
            zrange set1 0 -1 withscores
            
        zrevrange key start end  [withscores]:(范围查询)获取集合中脚标为start-end的成员,
                                                [withscores]参数表面返回的成员包含其分数。此为从大到小排序
        例:#从set1中查询所有元素
            zrevrange set1 0 -1
            #从set1中查询所有元素并带其值
            zrevrange set1 0 -1 withscores
        
    Ⅲ、删除操作
        zrem key member[member ...]:移除集合中指定的成员,可以指定多个成员。
        例:从set1中删除 zhangsan 和 lisi
            zrem set1 zhangsan lisi

        del set1
    
    Ⅳ、扩展命令
        zremrangebyrank key start stop:按照排名范围删除元素
        例:删除第一个和第二个元素(按照索引方式删除)
            zremrangebyrank set1 0 1
            
        zremrangebyscore key min max:按照值范围删除元素
        例:删除值在500-1500的元素
            zremrangebyscore set1 500 1500
        
        zrangebyscore key min max [withscores][limit offset count]:
            返回分数在[min,max]的成员并按照分数从低到高排序。
            [withscores]:显示分数;
            [limit offset count]:offset,表明从脚标offset的元素开始并返回count个成员。
            (分页操作)
        例:zrangebyscore set1 500 1500 withscores limit 0 2
        
        zincrby key increment member:设置指定成员的增加的值。返回值是更改后的值。
        例:zincrby set1 200 zhangsan
        
        zcount key min max:获取分数在[min,max]之间的成员个数
        例:zcount set1 0 2000
        
        zrank key member:返回成员在集合中的排名。索引(从小到大)
        例:zrank set1 zhangsan
        
        zrevrank key member:返回成员在集合的排名。索引(从大到小)
        例:zrevrank set1 zhangsan

⑦Redis通用命令
    
    Ⅰ、keys pattern:获取所有的与pattern匹配的key,返回所有与该key匹配的keys。
                    通配符:
                    * 表示任意一个或多个字符。
                    ? 表示任意一个字符。
                    
    例:#查询所有的key
        keys *  
        #匹配key长度是4位的key名
        keys ????
        #匹配key名中包含name的key
        keys *set*
        
    Ⅱ、del key1 key2 ...:删除指定的key
    
    Ⅲ、exists key:判断该key是否存在,1代表存在,0代表不存在
    
    Ⅳ、rename key newkey:为当前的key重命名(不常用)
    
    Ⅴ、设置key有效/过期的操作
        1)expire key:设置过期时间,单位:秒
        例:#设置list1生存时间,从永久变为30秒,过期后删除
            expire list1 30
    
        2)ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1。
                如果返回-2表示超时不存在(即key已经到期)。
        例:#查询list1的剩余时间
            ttl list1
                
    Ⅵ、type key:获取指定key的值类型。该命令将以字符串的格式返回。
                  返回的字符串为string、list、set、hash和zset,如果key不存在返回none。
    
    Ⅶ、扩展知识-消息订阅与发布
        多用于订阅新闻、新闻发布
        1)消息订阅
            subscribe channel:订阅频道
            例:subscribe my1 订阅my1这个频道
        2)消息发布
            publish channel content:在指定的频道中发布消息
            例:publish my1 'how do you do?'
        3)批量订阅频道
            psubscribe channel*
            例:psubscribe my* 订阅以“my”开头的频道
    Ⅷ、扩展知识-多数据库
        Redis默认有16个数据库。0,1,2,...,15。数据库与数据库之间不可共享键值对
        在Redis上所做的所有数据操作,都是默认在0号数据库上操作
        
        1)切换数据库:
            select 数据库名
            例:切换到1号数据库
                select 1
        2)把某个键值对进行数据库移植
            move key 数据库名
            例:将username移植到1号数据库中
            move username 1
        3)清空当前数据库:flushdb    (慎用)
        4)清空Redis服务器数据:flushall    (慎用)
        
    Ⅸ、扩展知识-Redis批量操作-事务
        MySQL事务:目的为了保证数据完整性,安全
        Redis事务:目的为了进行Redis语句的批量化执行
        1)事务                    
            multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,
                直到执行EXEC时,这些命令才会被原子的执行,类似于关系型数据库中的:begin transaction
            exec:提交事务,类似于关系型数据库中的:commit    --执行批量化操作
            discard:事务回滚,类似于关系型数据库中的:rollback --不执行批量化操作
    Ⅹ、扩展知识-Redis了解命令
        1)测试命令
            ping 测试连接是否存在,返回pong即存在
        2)echo message (几乎无用),返回message
        
        3)切换数据库
            select db    切换到某一个数据库
        4)退出连接
            quit    退出客户端,相当于CTRL+C
        5)数据库中key的数目
            dbsize    返回当前数据库中key的数目
        6)查看Redis的信息
            info    查看Redis的具体信息
    
⑧Redis持久化
    关系型数据库MySQL持久化
        任何增删改语句,都是在硬盘上做的操作,断电以后,硬盘上数据还存在
    
    非关系型数据库Redis
        默认情况下,所有的增删改操作,数据都是在内存中进行。断电以后,内存中的数据不存在。
        
        断电以后,redis的部分数据会丢失,丢失的数据时保存在内存中的数据。可见,Redis是存在持久化操作的
        
    Redis持久化-两种策略
        1)RDB: 是Redis默认的持久化操作
            在Redis目录中有个dump.rdb文件,其相当于照快照,保存的是一种状态。
            20GB数据--相当于-->几kb快照
            优点:1】快照保存数据速度极快,还原数据速度也极快
                  2】适用于灾难备份,如发生灾难,将dump.rdb拷走即可
            缺点:1】RDB机制符合要求就会照快照(随时随地启动),会占用一部分系统资源(突然占用),
                     不适合小内存机器的使用。很可能内存不足,直接宕机(服务器关闭非正常关闭)
                  2】只适用于内存充裕的计算机
            Ⅰ、RDB何时进行照快照
                服务器正常关闭时,照快照
                key满足以下三个条件之一时,照快照
                    save 900 1        #每900秒(15分钟)至少有1个key发生变化,则dump内存快照
                    save 300 10        #每300秒(5分钟)至少有10个key发生变化,则dump内存快照
                    save 60 10000    #每60秒(5分钟)至少有10000个key发生变化,则dump内存快照
                    key发生变化(key数据的添加、修改、删除)
                    例1:12:00-12:15,有1个key发生变化,在12:15就照一次快照保存
                        12:00-12:15,没有任何key发生变化,在12:15就不会快照保存
                    
                    例2:12:00-12:05,有11个key发生变化,在12:05就照一次快照保存
                        12:00-12:15,有9个key发生变化,在12:05就不会快照保存,但是在12:15会照快照
                        
                    例3:12:00-12:01,有15000个key发生变化,在12:01就照一次快照保存
                        12:00-12:01,有1000个key发生变化,在12:01就不会快照保存,但是12:05会照快照
        2)AOF:使用日志功能保存数据的操作--内存比较小的计算机
                默认是AOF机制是关闭的。其有三种配置方式:
                Ⅰ、每秒同步(默认)--安全性低,比较节省系统资源
                    每秒进行一次AOF保存数据
                Ⅱ、每修改同步--比较安全,但是极为浪费效率
                    只要有key变化(key数据的添加、修改、删除)语句,就进行AOF保存数据
                Ⅲ、不同步--不安全
                    不进行任何持久化操作
                
                Ⅳ、AOF操作:
                    只会保存导致key变化的语句
                Ⅴ、AOF配置:
                    everysec    #每秒钟同步一次,该策略为AOF的缺省策略
                    always        #每次有数据修改发生时,都会写入AOF文件
                    no            #从不同步。高效但是数据不会被持久化
                Ⅵ、开启AOF机制
                    1】打开redis.conf文件,修改 appendonly no 为 appendonly yes
                    2】再将    # appendfsync always
                              appendfsync everysec
                            # appendfsync no
                        改为
                              appendfsync always
                            # appendfsync everysec
                            # appendfsync no
                    3】关闭客户端,删除dump.rdb文件
                    4】重启redis服务,会多出一个 appendonly.aof 文件
                Ⅶ、优缺点
                    1】优点:
                        1)、持续性占用极少量的内存资源
                    2】缺点:
                        1)、日志文件会特别大,不适用于灾难恢复
                        2)、恢复效率远远低于RDB
                        
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值