客户端命令
添加/修改
添加/修改
set key value
添加(分布式锁,只有key不存在时生效)
setnx key value
此时若多个客户端执行这个命令,只有一个成功,保证每次锁只有一个人拿到,只有这个人释放后, 其他人才能操作,但此时需要注意死锁。 (可以尝试通过expire命令给当前key设置过期时间,避免死锁)
添加/修改(多个)
mset key1 value1 key2 value2
添加/修改(多个,分布式锁,只有key不存在时生效)
msetnx key value[key value …
添加/修改(设置过期时间)
setex key time value
如果 key 已经存在, setex命令将会替换旧的值,并设置过期时间
通过数据有效性控制业务行为,如:限制客户每4个小时才能投一次票,此时可以 set user:id 4*60*60 1
查询
获取key的值
get key
获取key并删除
getdel key
获取旧值并设置新值
getset key value
获取key的值并设置过期时间
getex key
获取key的值并清除过期时间
set key value KEEPTTL
查询多个key的value
mget key1 key2
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil
返回key集合中的索引start和索引end之间的元素(包含start和end)
getrange key start end getrange k1 0 -1 返回集合中所有元素
方法
获取key 所储存的字符串值的长度
strlen key
当 key 储存的不是字符串值时,返回一个错误
追加
append key value
如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾 如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样
修改指定位置的值
setrange key offset value
127.0.0.1:6379> set k6 abcd1234 127.0.0.1:6379> setrange k6 1 xxx 127.0.0.1:6379> get k6 "axxx1234"
将 key 中储存的数字值增一
incr key
若不存在,则赋值为"1" 如果字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误
将 key 中储存的数字值减一
decr key
若不存在,则赋值为"-1" 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误
将key存储的数字值按照step进行增/减
incrby/decrby key step
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误
springboot操作string类型
引入
@Autowired private RedisTemplate redisTemplate;
增加/修改
增加/修改
redisTemplate.opsForValue().set("name","jkw");
添加(分布式锁,只有key不存在时生效)【key不存在为true,key存在为false】
Boolean flag=redisTemplate.opsForValue().setIfAbsent("name","jkw");
添加/修改(多个)
Map map=new HashMap(); map.put("k1","v1"); map.put("k2","v2"); redisTemplate.opsForValue().multiSet(map);
添加/修改(多个,分布式锁,只有key不存在时生效)
Map map=new HashMap(); map.put("k1","v1"); map.put("k2","v2"); redisTemplate.opsForValue().multiSetIfAbsent(map);
修改(key存在时生效)【key存在为true,key不存在为false】
Boolean flag=redisTemplate.opsForValue().setIfPresent("name","jkw");
同时设值过期时间(参数为:TimeUnit)
void set(K key, V value, long timeout, TimeUnit unit); Boolean setIfAbsent(K key, V value, long timeout, TimeUnit unit); Boolean setIfPresent(K key, V value, long timeout, TimeUnit unit);
timeout:多少时间单位 unit:时间单位 TimeUnit.NANOSECONDS:纳秒 TimeUnit.MICROSECONDS:微秒 TimeUnit.MILLISECONDS:毫秒 TimeUnit.SECONDS:秒种 TimeUnit.MINUTES:分钟 TimeUnit.HOURS:小时 TimeUnit.DAYS:天
同时设置过期时间(单位:Duration)
void set(K key, V value, Duration timeout); default void setIfAbsent(K key, V value, Duration timeout); Boolean setIfPresent(K key, V value, Duration timeout);
timeout:时间单位,可链式调用 Duration.ofDays(1):天 Duration.ofHours(1):时 Duration.ofMinutes(1):分 Duration.ofSeconds(1):秒 Duration.ofMillis(1):毫秒 Duration.ofNanos(1):纳秒
//过期时间是1天1小时 redisTemplate.opsForValue().set("key","value", Duration.ofDays(1).ofHours(1)); //过期时间是2天1小时 redisTemplate.opsForValue().setIfAbsent("key","value", Duration.ofDays(2).ofHours(1)); //过期时间是3天3秒钟 redisTemplate.opsForValue().setIfPresent("key","value", Duration.ofDays(3).ofSeconds(3));
查询
获取key的值
redisTemplate.opsForValue().get("name")
批量获取值
List<String> list=new ArrayList<>(); list.add("k1"); list.add("k2"); redisTemplate.opsForValue().multiGet(list);
获取key并删除
redisTemplate.opsForValue().getAndDelete("key");
获取旧值并设置新值
redisTemplate.opsForValue().getAndSet("key","value");
获取key的值并设置过期时间(单位:TimeUnit)
redisTemplate.opsForValue().getAndExpire("key",1,TimeUnit.HOURS);
获取key的值并设置过期时间(单位:Duration)
//过期时间是3天3小时 redisTemplate.opsForValue().getAndExpire("key",Duration.ofDays(3).ofSeconds(3));
获取key的值并清除过期时间
redisTemplate.opsForValue().getAndPersist("key");
方法
追加字符串
redisTemplate.opsForValue().append("key","value");
获得长度
redisTemplate.opsForValue().size("key");
获得指定范围的字符串
redisTemplate.opsForValue().get("key",0,5);
替换指定索引的内容
redisTemplate.opsForValue().set("key","value",0);
自增1
redisTemplate.opsForValue().increment("key");
自减1 redisTemplate.opsForValue().decrement("key"); 自增指定整数 redisTemplate.opsForValue().increment("key",3); 自减指定整数 redisTemplate.opsForValue().decrement("key",3); 自增指定小数 redisTemplate.opsForValue().increment("key",3.3);