Redis 初学个人总结(自学)

本文详细介绍了Redis的基本命令,包括键值操作、数据结构管理和事务处理等,适用于初学者快速上手和高级用户深入研究。

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

Redis:

     Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。


常用命令:    

     TYPE key — 用来获取某key的类型
    
      keys 命令
        ?    匹配一个字符
        *    匹配任意个(包括0个)字符
        []    匹配括号间的任一个字符,可以使用 "-" 符号表示一个范围,如 a[b-d] 可以匹配 "ab","ac","ad"
        \x    匹配字符x,用于转义符号,如果要匹配 "?" 就需要使用 \?
 
     判断一个键值是否存在
        exists key
        如果存在,返回整数类型 1 ,否则返回 0
 
     删除键
        del key [key.....]
        可以删除一个或多个键,返回值是删除的键的个数
        注意:不支持通配符删除
 
 
     赋值与取值
        set key value       赋值    $redis->get('key');
        get key             取值    $redis->set('key','value');
    
     递增数字
        incr key
        当存储的字符串是整数形式时,redis提供了一个使用的命令 incr 作用是让当前的键值递增,并返回递增后的值
       
        incr num
        当要操作的键不存在时会默认键值为 0  ,所以第一次递增后的结果是 1 ,当键值不是整数时 redis会提示错误
       
       
     增加指定的整数
        incrby key increment
        incrby 命令与 incr 命令基本一样,只不过前者可以通过 increment 参数指定一次增加的数值如:
            incrby num 2
            incrby num 3
 
     减少指定的整数
        decr key
        decrby key increment
        desc 命令与incr 命令用法相同,只不过是让键值递减
        decrby 命令与 incrby命令用法相同
 
     增加指定浮点数
        incrbyfloat key increment
        incrbyfloat 命令类似 incrby 命令,差别是前者可以递增一个双精度浮点数,如:
        incrbyfloat num 2.7
         注意: ( 受reids 版本限制,版本需要大于 2.6 版本) 
 
     向尾部追加值
        append key value
        作用是向键值的末尾追加 value ,如果键不存在则将改键的值设置为 value,即相当于 set key value。返回值是追加后字符串的长度
        如:append foo " hello word!"
 
     获取字符串长度
        strlen key
        返回键值的长度,如果键不存在则返回0
 
     同时 获得/设置 多个键值
        mget key [key.....]
        mset key value [key value .......]
        
     散列类型
      
     赋值与取值
        hset key field value
        hget key field
        hmset key field value [ field value ...... ]
        hmget key field [ field ...... ]
        hgetall key
        hset 命令用来给字段赋值,而hget命令用来获得字段的值
        hset 命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作还是更新操作, 当执行的是插入操作时, hset 命令返回 1 ,当执行的是更新操作时,hset 命令返回的是 0 ,当键本身不存在时, hset 命令还会自动建立
        hmset 设置多个键值
        hmget 获得多个键值
        hgetall 获取键中所有字段和字段值却不知道键中有哪些字段时使用,返回的结果是字段和字段值组成的列表
 
     判断字段是否存在
        hexists key field
        存在返回 1 ,否则返回 0
    
     当字段不存在时赋值
        hsetnx key field value
        hsetnx 命令与hset 命令类似,区别在于如果字段已经存在,hsetnx 命令将不执行任何操作
        
     增加数字
        hincrby key field increment
        使字段值增加指定的整数
 
     删除字段
        hdel key field [ field .....]
        删除一个或多个字段,返回值是被删除的字段个数
 
     只获取字段名或字段值
        hkeys key
        hvals key
        hkeys 获取所有字段的名字
        hvals 获得键中所有字段的值
 
     获得字段数量
        hlen key
 
 
列表类型
    
     向列表两端增加元素
        lpush key value [ value ....... ]
        rpush key value [ value ....... ]
        lpush 命令用来向列表左边增加元素,返回表示增加元素后列表的长度 
        rpush 命令用来向列表右边增加元素,返回表示增加元素后列表的长度 
        
     从列表两端弹出元素
        lpop key
        rpop key
        lpop 命令可以从列表左边弹出一个元素,lpop 命令执行两步操作,1:将列表左边的元素从列表中移除,2:返回被移除元素值
        rpop 命令可以从列表右边弹出一个元素
 
     获取列表中元素个数
        llen key
        当键不存在时,llen 返回 0
 
     获得列表片段
        lrange key start stop
        获得列表中的某一片段,返回索引从 start 到 stop 之间的所有元素(包括两端的元素) 索引开始为 0
        注:lrange 与很多语言中用来截取数组片段的方法有一点区别是 lrange 返回的值包含最右边的元素
               lrange 命令也支持负索引,表是从右边开始计算序数,如 ' -1 ' 表示最右边第一个元素, ' -2 ' 表示最右边第二个元素,一次类推
 
     删除列表中指定的值
        lrem key count value
        lrem 命令会删除列表中前 count 个值为 value 的元素,返回值是实际删除的元素个数。根据count 值的不同,lrem 命令执行的方式会
            略有差异
            当 count > 0 时,lrem 命令会从列表左边开始删除前 count 个值为 value 的元素
            当 count < 0 时,lrem 命令会从列表右边开始删除前count 个值为 value 的元素
            当 count = 0 时,lrem 命令会删除所有值为value的元素
 
     获得 / 设置 指定索引的元素值
        lindex key index
        lset key index value
        lindex 命令用来返回指定索引的元素,索引从 0 开始 ,如果 index 是负数则表示从右边开始计算的索引,最右边元素的索引是 -1 
        lset 是通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value 
 
     只保留列表指定片段
        ltrim key start end
        ltrim 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和 lrange 命令相同
        ltrim 命令常和 lpush 命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的 100 条日志,则每次加入新元素时,调用一次ltrim 命令即可;
 
     向列表中插入元素
        linsert key before | after pivot value
        linsert 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 before 还是 after 来决定将 value 插入到该元素的
            前面还是后面,如果命令执行成功,返回插入操作完成之后列表的长度。如果没有找到 pivot 返回 -1 如果key 不存在或为空,返回 0
            
     将元素从一个列表转到另一个列表R
        rpoplpush source destination
        rpoplpush 先执行 rpop 命令在执行 lpush 命令。rpoplpush 命令先会从source 列表类型键的右边弹出一个元素,然后将其加入到 destination 列表类型键的左边,并返回这个元素的值,整个过程是原子的
 
 
集合类型
     增加删除命令
        sadd key member [ member .... ]
        srem key member [ member .... ]
        sadd 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在与集合中就会忽略这个元素。返回值是成功加入的元素数量(忽略的元素不计算在内)
        srem 命令用来从集合中删除一个或多个元素,并返回删除成功的个数
 
     获得集合中的所有元素
        smembers key
        返回集合中的所有元素
 
     判断元素是否在集合中
        sismember key member
        判断一个元素是否在集合中是一个时间复杂度为 0(1) 的操作,无论集合中有多少个元素, sismember 命令始终可以极快的返回结果。当值存在时 sismember 命令返回 1 ,当值不存在或者键不存在时返回 0
 
 
    获得集合中元素的个数
            scard key
            
    进行集合运算并将结果存储
         sdiffstore destination key [ key ...... ]
         sinterstore destination key [ key ...... ]
         sunionstore destination key [ key ...... ]
         sdiffstore 命令和 sdiff 命令功能一样,唯一的区别就是前者不会直接返回运算的结果,而是将结果存在 destination 键中
         sinterstore 这个命令类似于 sinter 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
         sunionstore 这个命令类似于 sunion 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
 
     随机获得集合中的元素
         srandmember key [ count ]
         该命令用来随机从集合中获取一个元素
         还可以传递 count 参数来一次随机获得多个元素,根据 count 的正负不同,具体表现也不同
         当count 为正数时,srandmember 会随机获取从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则srandmember 会返回集合中的全部元素,当 count 为负数时,srandmember 会随机从集合中获得 |count| 个的元素,这些元素有可能相同
         注:当传递count 参数时,在windows环境下提示命令参数错误
 
     从集合中弹出一个元素
            spop key
            由于集合类型的元素是无序的,所以 spop 命令会从集合中随机选择一个元素弹出,返回值为被移除的随机元素,如果 key 不存在或者 
                key 为空集时,返回 nil
 
 
有序集合类型(sorted set)
         增加元素
            zadd key score member [ score member ...... ]
            zadd 命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在,则会用新的分数替换原有的分数。zadd命令的返回
                值是新加入到集合中的元素个数(不包含之前已经存在的元素)
 
         获得元素的分数
            zscore key member
            
         获得排名在某个范围的元素列表
            zrange key start stop [ withscores ]
            zrevrange key start stop [ withscores ]
            zrange 命令会按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)。zrange 命令和 lrange 命
                令十分相似,如索引都是从0开始,负数代表从后向前查找(-1 表示最后一个元素)。如果需要同时获得元素的分数的话,可以在 
                 zrange 命令的尾部加上 widthscores 参数
            注:如果两个元素的分数相同,redis会按照字典顺序(即 0<9<A<Z<a<z 这样的顺序)来进行排列。如果元素的值是中文,则取决于zrevrange 命令和 zrange 的唯一不同在于 zrevrange 是按照元素分数从大到小的顺序给定结果的
           
         获得指定分数范围内的元素
            zrangebyscore key min max [ withscores ] [ limit offset count ]
            该命令按照元素分数从小到大的顺序返回分数在 min 到 max 之间(包含 min 和max 的元素)
            如果希望分数范围不包含端点值,可以在分数前加上 "(" 符号,例如:希望返回80分到100分的的数据,可以包含80分单不包含100分
               
            min 和 max 还支持无穷大,同 zadd 命令一样,-inf 和 +inf 分别表示负无穷大和正无穷大。比如希望得到所有分数高于 80分(不包含80分)的人的名单,但是却不知道最高分是多少,这是就可以使用 +inf
                zrangebyscore scoreboard (80 +inf
                
            命令 limit offset count 与 SQL 中的用法基本相同,即在获得的元素列表的基础上向后偏移 offset 个元素并且只获取前count个元素
                
            zrevrangebyscore 不仅是按照元素分数从大往小的顺序给出结果,而且他的 min 和max 的参数的顺序和 zrangebyscore 命令是相反的
               
 
         增加某个元素的分数
            zincrby key increment member
            zincrby 命令可以增加一个元素的分数,返回值是更改后的分数,例如想给peter 加 4 分
            zincrby scoreborder 4 peter
            increment  也可以是负数表示减分
            zincrby scoreborder -4 peter
            如果指定元素不存在,redis 在执行命令前会先建立它并将他的值赋为0在执行操作        
 
         获得集合中元素的数量
            zcard key
         获得指定分数范围内的元素个数
            zcount key min max
            zcount 命令的 min max 参数的特性与 zrangebyscore 命令中的一样
           
 
         删除一个或多个元素
            zrem key member [ member .... ]
            zrem 命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)
 
         按照排名范围删除元素
            zremrangebyrank key start stop
            按照元素分数从小到大的顺序(即索引 0 表示最小的值)删除在指定排名范围内的所有元素,并返回删除元素的数量
           
 
         按照分数范围删除元素
            zremrangebyscore key min max
            zremrangebyscore 命令删除指定分数范围内的所有元素,参数 min 和 max 的特性和 zrangebyscore 命令中的一样,返回值是删除元素的个数
           
 
         获得元素的排名
            zrank key member
            zrevrank key member
            zrank 命令会按照元素分数从小到大的顺序获得指定的元素排名(从 0 开始,即分数最小的元素排名为0)
            zrebrank 命令则正好相反,分数最大的元素排名为0
 
         计算有序集合的交集
            zinterstore destination numkeys key [ key ... ] [ weights weight [ weight ... ] ] [ aggregate SUM | MIN | MAX ]
            zinterstore 命令用来计算多个有序集合的交集病将结果存储在 destination 键中(同样以有序集合类型存储),返回值为 destination 
                键中元素的个数,destination 键中元素的分数是由 aggregate 参数决定的
            1. 当 aggregate 是 SUM (也就是默认值),destination 键中元素的分数是每个参与计算的集合中该元素分数的和
               
            2.当 aggregate 是 MIN 时,destination 键中元素的分数是参与计算的集合中该元素分数最小值
               
            3.当 aggregate 是 MAX 是,destination 键中元素的分数是参与计算的集合中该元素分数最大值
         
          zinterstore 命令还能通过 weights 参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重 
 
         计算集合间的并集
            zunionstore 
            用法与 zinterstore 命令的用法一样
 
 
事务
        事务的原理是先将属于一个事务的命令发送给redis ,然后再让 redis 依次执行这些命令
       
            
        错误处理
        (1)语法错误。语法错误指命令不存在或者命令参数个数不对。这种情况下,事务中只要有一个命令有语法错误,执行exec命令后redis
                就会直接返回错误,连语法正确的命令也不会执行
                注:redis 2.6.5 之前的版本会忽略有语法错误的命令,然后执行事务中其他语法正确的命令。
        (2)运行错误。运行错误指在命令执行时出现的错误,比如使用散列类型的命令操作集合类型的键,这种错误在实际执行之前redis是无
                法发现的,所以在事务里这样的命令是会被redis接受并执行的,如果事务里的一条命令出现运行错误,事务里其他的命令依然会继
                续执行(包含出错命令之后的命令)
 
        reids的事务没有关系数据库事务提供的回滚功能,为此开发者必须在事务执行出错之后自己收拾剩下的摊子
        
     watch 命令
        watch key [ key ... ]
        监视一个或多个 key ,如果在事务执行之前这个或这些 key 被其他命令所改动,那么事务将被打断,监控一直持续到exec命令
       
 
     unwatch
        取消 watch 命令对所有 key 的监视
 
    
     生存时间
        expire
        expire 命令的使用方法为 expire key seconds ,其中 seconds 参数表示键的生存时间,单位是秒,该参数必须是整数
       
        命令返回 1表示设置成功,返回 0 则表示键不存在或设置失败
 
        如果想知道一个键还有多久会被删除,可以使用 ttl 命令。返回值是键的剩余时间(单位是秒),
       
        如果想取消键的生存时间设置(即将键恢复成为永久的),可以使用 persist 命令。如果生存时间被成功清除则返回 1 。否则返回 0
        
        除了 persist 命令之外,使用 set 、getset 命令为键赋值也同时会清楚键的生存时间
        注: incr 、lpush、hset、zrem 命令均不会影像键的生存时间
 
        精确控制键的生存时间应该使用 pexpire 命令。该命令的单位是毫秒
        可以使用 pttl 命令以毫秒为单位返回键的剩余时间
        另外不太常用命令:expireat 和 pexpireat,该命令第二个参数表示键的生存时间的截至时间,expireat 单位秒 pexpireat 单位毫秒
 
     sort 
        该命令可以对列表类型,集合类型,和有序集合类型键进行排序
        列表类型:
       
        
        有序集合类型排序时,会忽略元素的分数,只针对元素的自身的值进行排序
       
        
        除了可以排列数字外,sort 命令还可以通过 alpha 参数实现按照字典顺序排列非数字元素
       
 
        sort 命令的 desc 参数可以实现将元素按照从大到小的顺序排列
        sort 命令还支持 limit 参数来返回指定范围的结果,用法和sql 语句一样 limit offset count ,表示跳过前 offset 个元素并获取之后的
            count 个元素
       
 
        sort 命令 by 参数,默认情况下, sort uid 直接按照 uid 中的值排序,通过 by 参数,可以让 uid 按照其他键的元素来排序
       
        user_level_* 是一个占位符,他先取出 uid 中的值,然后在用这个值来查找相应的键
            比如在对 uid 列表进行排序时, 程序就会先取出 uid 的值 1 、 2 、 3 、 4 , 然后使用 user_level_1 、 user_level_2 、 user_level_3 
            和   user_level_4 的值作为排序 uid 的权重。
 
        使用 get 选项,可以根据排序的结果来取出相应的键值
        
        一个sort 命令中可以有多个 get 参数(而 by 参数只能有一个)
 
        默认情况下 sort 命令会直接返回排序结果,如果希望保存排序结果,可以使用 store 参数,保存后键的类型为列表类型

 使用redis:

      开始在 Java 中使用 Redis 前,我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用Java。

              从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。

               make成功后会在src文件夹下产生一些二进制可执行文件,包括redis-server、redis-cli等等:

               代码:

               $ find . -type f -executable
               ./redis-benchmark //用于进行redis性能测试的工具
               ./redis-check-dump //用于修复出问题的dump.rdb文件
               ./redis-cli //redis的客户端
               ./redis-server //redis的服务端
               ./redis-check-aof //用于修复出问题的AOF文件
               ./redis-sentinel //用于集群管理

                ./redis-server//启动服务端

                shutdown //通过客户端关闭服务端

                $./redis-cli //启动客户端

实战案例

               新建项目,引入jar包。(记得启动redis服务)

               1. 连接本地的 Redis 服务和查看服务是否运行

package com.souvc.redis;

import redis.clients.jedis.Jedis;

public class RedisJava {
    public static void main(String[] args) {
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功!");
        // 查看服务是否运行
        System.out.println("服务 正在运行: " + jedis.ping());
    }
}

           2.  Redis Java String(字符串) 实例

package com.souvc.redis;

import redis.clients.jedis.Jedis;

public class RedisStringJava {
    
    public static void main(String[] args) {
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功!");
        // 设置 redis 字符串数据
        jedis.set("souvc", "http://www.cnblogs.com/liuhongfeng/");
        // 获取存储的数据并输出
        System.out.println("redis存储的字符串是: " + jedis.get("souvc"));
    }
}

         3. Redis Java List(列表) 实例

package com.souvc.redis;

import java.util.List;

import redis.clients.jedis.Jedis;

public class RedisListJava {
    public static void main(String[] args) {
        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功!");
        
        // 存储数据到列表中
        jedis.lpush("kecheng", "java");
        jedis.lpush("kecheng", "php");
        jedis.lpush("kecheng", "Mysql");
        
        // 获取存储的数据并输出
        List<String> list = jedis.lrange("kecheng", 0, 5);
        for (int i = 0; i < list.size(); i++) {
            System.out.println("redis list里面存储的值是:" + list.get(i));
        }
        
    }
}
         4. Redis Java Map 实例

package com.souvc.redis;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import redis.clients.jedis.Jedis;

public class RedisMapJava {

   
   public static void main(String[] args) {

        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功!");
        
        
         //-----添加数据----------  
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "xinxin");
        map.put("age", "22");
        map.put("qq", "123456");
        
        
        jedis.hmset("user",map);
        //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List  
        //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数  
        List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
        System.out.println(rsmap);  
  
        //删除map中的某个键值  
        jedis.hdel("user","age");
        System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null  
        System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2 
        System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true  
        System.out.println(jedis.hkeys("user"));//返回map对象中的所有key  
        System.out.println(jedis.hvals("user"));//返回map对象中的所有value 
  
        Iterator<String> iter=jedis.hkeys("user").iterator();  
        while (iter.hasNext()){  
            String key = iter.next();  
            System.out.println(key+":"+jedis.hmget("user",key));  
        }  
    }

}

             5. Redis Java Set 实例
package com.souvc.redis;

import redis.clients.jedis.Jedis;

public class RedisSetJava {

   
   public static void main(String[] args) {

        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功!");
        
         //删除map中的某个键值  
        //jedis.hdel("user");
        
        //添加  
        jedis.sadd("user","liuling");  
        jedis.sadd("user","xinxin");  
        jedis.sadd("user","ling");  
        jedis.sadd("user","zhangxinxin");
        jedis.sadd("user","who");  
       
        //移除noname  
        jedis.srem("user","who");  
        System.out.println(jedis.smembers("user"));//获取所有加入的value  
        System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素  
        System.out.println(jedis.srandmember("user"));  
        System.out.println(jedis.scard("user"));//返回集合的元素个数  
        
    }

}

           6. Redis Java Sort实例

package com.souvc.redis;

import redis.clients.jedis.Jedis;

public class RedisSortJava {

   
    public static void main(String[] args) {

        // 连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接本地的 Redis 服务成功!");
        
         //jedis 排序  
        //注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)  
        jedis.del("a");//先清除数据,再加入数据进行测试  
        jedis.rpush("a", "1");  
        jedis.lpush("a","6");  
        jedis.lpush("a","3");  
        jedis.lpush("a","9");  
        System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1]  
        System.out.println(jedis.sort("a")); //[1, 3, 6, 9]  //输入排序后结果  
        System.out.println(jedis.lrange("a",0,-1));  
    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值