RedisTemplate操作命令

Stella981
• 阅读 918

字符串操作


redis储存的字符串都是以二进制的形式存在!

字符串类型的内部编码有3种:
int:8个字节的长整型。
embstr:小于等于39个字节的字符串。
raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

命令

操作

返回值

set(K key, V value)

 

void

set(K key, V value, long timeout, TimeUnit unit)

过期时间,TimeUnit时间格式

void

set(K key, V value, Duration timeout)

Duration过期时间

void

setIfAbsent(K key, V value)

如果不存在则设置【setnx】

Boolean

setIfAbsent(K key, V value, long timeout, TimeUnit unit)

 

Boolean

setIfAbsent(K key, V value, Duration timeout)

 

Boolean

setIfPresent(K key, V value)

如果存在则设置【setex】

Boolean

setIfPresent(K key, V value, long timeout, TimeUnit unit)

 

Boolean

setIfPresent(K key, V value, Duration timeout)

 

Boolean

multiSet(Map<? extends K, ? extends V> map)

设置多个键值对【mset】

void

multiSetIfAbsent(Map<? extends K, ? extends V> map)

如果不存在则设置多个键值对

Boolean

get(Object key)

获取

Object V

getAndSet(K key, V value)

获取原值同时设置新值【getset】

Object V

multiGet(Collection keys)

获取集合【mget】

List

increment(K key)

自增操作(键不存在则创建并按照初始值0自增)【incr】

Long

increment(K key, long delta)

增加数操作【incrby】

Long

increment(K key, double delta)

增加浮点数【incrbyfloat】

Double

decrement(K key)

自减【decr】

Long

decrement(K key, long delta)

减去操作【decrby】

Long

append(K key, String value)

追加值【append】

Integer

get(K key, long start, long end)

获取指定位置的字符【getrange】

String

set(K key, V value, long offset)

设置指定位置的字符(覆盖后面的长度)【setrange】

void

size(K key)

值长度【strlen】

Long

setBit(K key, long offset, boolean value)

设置或者清除指定位置的值(二进制)【setbit】

Boolean

getBit(K key, long offset)

获取比特位的值

Boolean

bitField(K key, BitFieldSubCommands subCommands)

见下方说明

List

getOperations()

 

RedisOperations<K, V>

  • setBit和getBit都是对二进制进行操作。因为redis储存的字符串都是以二进制的形式存在,所以这里是设置二进制偏移位置上的值,将其设置为0或1

  • RedisTemplate操作命令

  • 二进制数系统中,每个0或1就是一个比特位(bit),位是数据存储的最小单位

  • 比如字符‘a’的ASII码是97,转换为二进制是01100001

  • 二进制数的一位所包含的信息就是一比特,如二进制数0100就是4比特

  • 字符-字节-比特,每个字符根据编码占用字节不同,8比特(bit)为1字节

  • BITFIELD 该命令将 Redis 字符串视为一个位数组,并且能够处理具有不同位宽和任意非(必要)对齐偏移量的特定整数字段。实际上,使用此命令可以将位偏移量为1234的带符号5位整数设置为特定值,从偏移量4567中检索31位无符号整数。

  • BITFIELD 能够在同一个命令调用中使用多位字段。它需要执行一系列操作,并返回一个响应数组,其中每个数组都与参数列表中的相应操作相匹配。

  • 以下命令将位偏移量为100的8位有符号整数加1,并在位偏移量0处获取4位无符号整数的值

    BITFIELD mykey INCRBY i5 100 1 GET u4 0

    1. (integer) 1 2) (integer) 0

支持的子命令和整数类型

  • GET - 返回指定的位域。
  • SET - 设置指定的位域并返回其旧值。
  • INCRBY - 递增或递减(如果给定负递增)指定的位域并返回新值。

还有一个子命令通过设置溢出行为来改变连续的 INCRBY子 命令调用的行为:

  • OVERFLOW [WRAP|SAT|FAIL]在期望整数类型的情况下,可以通过i为有符号整数和u无符号整数加上整数类型的位数来构成它。例如u8,一个8位的无符号整数,i16是一个16位的有符号整数。支持的类型对于有符号整数最多为64位,对于无符号整数最多为63位。使用无符号整数的限制是由于当前Redis协议无法将64位无符号整数作为答复返回。位和位置偏移有两种方式可以指定位域命令中的偏移量。如果指定了一个没有任何前缀的数字,它将被用作字符串内的基于零的位偏移量。但是如果偏移量前缀为a#字符,指定的偏移量乘以整数类型的宽度,例如:BITFIELD mystring SET i8#0 100 i8#1 200将设置第一个i8整数在偏移量0和第二个偏移量为8.这种方式你没有如果你想要的是一个给定大小的整数数组,你可以在你的客户端内部进行数学运算。溢出控制使用该OVERFLOW命令,用户可以通过指定一个来微调增量的行为或减少溢出(或下溢)以下行为:

  • WRAP:环绕,包含有符号和无符号整数。在无符号整数的情况下,包装类似于以整数可以包含的最大值(C标准行为)来执行操作。使用带符号整数,而不是包装意味着溢出重新开始朝向最负值,并且溢出朝向最正值,例如,如果i8整数设置为127,则将其递增1 -128。

  • SAT:使用饱和算术,即在下溢时将该值设置为最小整数值,并在溢出时将其设置为最大整数值。例如,i8从数值120开始递增一个以10 为增量的整数将导致数值127,并且进一步增量将始终使数值保持在127.在下溢时发生同样的情况,但是朝向该数值被阻塞在最大负值。

  • FAIL:在这种模式下,没有检测到溢出或下溢操作。相应的返回值设置为 NULL,以向调用者发送信号。 请注意,每条OVERFLOW语句只影响子命令列表中后面的 INCRBY命令,直到下一条OVERFLOW语句为止。

    BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1

    1. (integer) 1 2) (integer) 1 > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 2 2) (integer) 2 > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 3 2) (integer) 3 > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 0 2) (integer) 3
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这