• redis 常见的命令


    1. String

    redis都是key-value的结果存储的,value可以存储String Number Float Bits等,但是最大的大小是512M。Redis中的key也是基于String类型存储,所以最大也是521M

    1.1 基本命令

    命令示例说明
    msetmset key1 value1 key2 value2批量设置key1=value1, key2=value2
    mgetmget key1 key2批量获取
    strlenstrlen key1获取value1长度
    appendappend key1 11追加内容
    getrangegetrange key1 0 3获取指定范围的字符
    incrincr intkey 、 incrby intkey 10整数值递增 默认+1,可设置递增值
    incrbyfloatincrbyfloat key3 1.1浮点值递增

    扩展:

    set mylock 1 EX 10 NX
    EX 设置指定的到期时间(秒)
    PX 设置指定的到期时间(毫秒)
    NX 仅在键不存在时设置键
    XX 只有在键已存在时才设置

    String 更多指令参考:https://redis.io/commands/?group=string

    1.2 应用场景

    • 缓存数据,速度快、无需消耗本地内存,不多讲了

    依赖引入

    <dependency> 
    	<groupId>org.springframework.bootgroupId> 
    	<artifactId>spring-boot-starter-data-redis- reactiveartifactId> 
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    配置序列化方式

    @Configuration 
    @EnableCaching 
    public class RedisConfig { 
    	@Bean 
    	RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { 
    		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); 	
    		redisTemplate.setConnectionFactory(redisConnectionFact ory); 
    		Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 
    		redisTemplate.setKeySerializer(new StringRedisSerializer()); 
    		redisTemplate.setValueSerializer(jackson2JsonRedisSeri alizer);
    		redisTemplate.setHashKeySerializer(new StringRedisSerializer()); 
    		redisTemplate.afterPropertiesSet(); return redisTemplate; 
    	} 
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    public List<Product> selectProduct() throws InterruptedException { 
    	String key = "productList"; 
    	List<Product> products = (List<Product>) redisTemplate.opsForValue().get(key); 
    	if (products == null) { 
    		//加锁 为了防止缓存 击穿(后面会讲),防止并发的时候请求全部并发打到DB
    		synchronized (Product.class){ 
    			products = (List<Product>) redisTemplate.opsForValue().get(key); //双重检查,如果不再 次检查就算加锁,请求还是会打到DB,只不过并行改成了串行 
    			//再次判断,保证进入DB只有 一次 
    			if (products==null) { 
    				products = productMapper.selectProduct(); 
    				if (products != null) { 
    					//查询数据不为 空,塞回到redis 
    					redisTemplate.opsForValue().set(key, products, 5, TimeUnit.MINUTES); //设置时间,因为DB根redis有数据一致性问 题,保证最终一致 
    				} 
    			} 
    		} 
    	}
    	return products;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 分布式id
      由reids生产唯一自增需要,在分布式环境下唯一
      一般使用redis的 incr相关命令完成

    2. Hash

    用来存储一组相关信息,方便更多的场景使用

    2.1 基本命令

    命令示例说明
    hsethset A a 1 、hset A b 1给key=A 设置k-v值
    hmsethmset A a 1 b 2 c 3批量设置k-v值
    hgethget A a获取 k-v 中k=a的值
    hmgethmget A a b c批量获取值
    hkeyshkeys A获取所有A的keys
    hvalshvals A获取所有A的values
    hgetallhgetall获取所有A 的k-v
    hincrbyhincrby A a 10给A的a对应value增加10
    hexistshexists A a查询key中 a是否存在
    hdelhdel A a删除key中 a
    hlenhlen A查看key中k-v数据长度

    3. List

    存储有序的字符串列表,元素可以重复。列表的最大长度为2^32-1个元素

    3.1 基础命令

    命令示例说明
    lpushlpush que a
    lpush que b c
    左添加元素
    rpushrpush que d e又添加元素
    lpoplpop que左弹出一个元素
    rpoprpop que右弹出一个元素
    blpopblpop que 2左弹出一个元素并设置超时,直到有数据弹出或者超时
    brpopbrpop que 2右弹出一个元素并设置超时,直到有数据弹出或者超时
    lindexlindex que 0查看第1个元素
    lindexlindex que 0 -1查看所有元素

    4. Set

    string类型的无需元素集合 ,最大存储2^32-1。并且添加、删除元素的时间都是O(1)。

    4.1 基本命令

    命令示例说明
    saddsadd A a b c添加一个或者多个元素
    smemberssmembers A查看所有元素
    scardscard A获取所有元素个数
    srandmembersrandmember A随机弹出一个元素
    spopspop A随机弹出一个元素
    sremsrem A a弹出指定元素
    sismembersismember A a查看元素是否存在
    sdiffsdiff A B获取前一个集合有而后集合没有的元素
    sintersinter A B获取两个集合的交集
    sunionsunion A B获取两个集合的并集

    5. Sorted Set(ZSet)

    sorted set,有序的set,每个元素有个score,score相同时,则按照key的ASCII码排序。

    5.1 基本命令

    命令示例说明
    zaddzadd Z 10 a 20 b 30 c批量添加
    zrangezrange Z 0 -1 withscores根据分数从低到高
    zrevrangezrevrange Z 0 -1 withscores根据分数从高到低
    zrangebyscorezrangebyscore z1 20 30根据分数范围获取值
    zremzrem z1 a移除元素
    zcardzcard z1获取zset个数
    zincrbyzincrby z1 20 b给某个元素加分
    zcountzcount z1 50 60获取范围内的个数
    zrankzrank z1 d返回指定元素的索引
    zscorezscore z1 d获取元素的分数

    6. BitMap

    位图不是实际的数据类型,而是String类型中定义的一种面向位的操作,所以这个位图最大长度为512M

    6.1 基本命令

    命令示例说明
    setbitsetbit permission 5 1设置位的值
    getbitgetbit permission 5获取位的值
    bitcountbitcount permission获取key的为1的个数
    bitposbitpos permission 1获取0或者1的第一位
    bitop ANDbitop AND hbit permission_1 permission获取多个bitmap的位操作,比如& , 获取bitkey与permission 的&运算 并且赋值给hbit

    6.2 应用场景

    实时统计数据
    考勤:如第一天 第三天 第十天签到

    setbit user1 1 1
    setbit user1 3 1
    setbit user1 10 1

    统计考勤天数

    bitcount user1

    7. 总结

    • 基于内存操作,不需要跟磁盘交互
    • 本身就是k-v结构,类似与hashMap,所有查询速度接近o(1)
    • 同时redis自己底层数据结构支持,比如跳表、SDS
    • 命令执行时单线程,同时通信采用多路复用
    • io多路复用,单个线程中通过记录跟踪每一个sock(io流)的状态来管理多个IO流
  • 相关阅读:
    不用电的计算机(二)
    低价治理全流程分享
    浏览器缓存机制
    金仓数据库KingbaseES客户端应用参考手册--6. dropuser
    centos离线安装fastdfs
    单例模式学习
    vue中的传值
    【Playwright+Python】系列教程(五)元素定位
    谷粒商城 (六) --------- 逆向工程生成微服务 CRUD 代码
    什么是 Spring Boot?与传统 Spring 框架的区别
  • 原文地址:https://blog.csdn.net/weixin_43704834/article/details/126474692