Redis - String

String

1 简介

string是redis最基本的类型,一个key对应一个value

string类型是二进制安全的。意思是redisstring可以包含任何数据。比如jpg图片或者序列化的对象

string类型是Redis最基本的数据类型,一个键最大能存储512MB

二进制安全特点:
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来
① 编码、解码发生在客户端完成,执行效率高
② 不需要频繁的编解码,不会出现乱码

2. String命令

//赋值语法:
set key value
//Redis SET 命令用于设置给定 key 的值。如果 key 已经存储值, SET 就覆写旧值,且无视类型
//成功返回ok 

stenx key value  //解决分布式锁 方案之一
//只有在 key 不存在时设置 key 的值。Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值

mest key value [key value ...]
//同时设置一个或多个 key-value 对

//取值语法: 
get KEY
//Redis GET命令用于获取指定 key 的值。
//如果 key 不存在,返回 nil 
//如果key 储存的值不是字符串类型,返回一个错误

getrange key start end 
//用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)

getbit key offset
//对 key 所储存的字符串值,获取指定偏移量上的位(bit)

mget key1 [key2..]
//获取所有(一个或多个)给定 key 的值

//GETSET语法:  
getset KEY  VALUE
//Getset 命令用于设置指定 key 的值,并返回 key 的旧值,当 key 不存在时,返回 nil 

strlen key
//返回 key 所储存的字符串值的长度

//删除语法:
del KEY 
//删除指定的KEY
//如果存在,返回1 失败返回0  

//自增/自减:
incr KEY
//Incr 命令将 key 中储存的数字值增1。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作 

//自增:
incrby KEY 增量值 
//Incrby 命令将 key 中储存的数字加上指定的增量值 

//自减:
decr KEY      
//或    
DECYBY KEY 减值 
//decR 命令将 key 中储存的数字减1

//字符串拼接:
append KEY VALUE 
//Append 命令用于为指定的 key 追加至未尾,如果不存在,为新建赋值 
3. 单数据操作与多数据操作的选择之惑

在上面可以看到对于set之类的指令有 set key value一次设置一个,也可以 mset key1 value1 key2 value2一次设置多个,那对于多个数据的set操作我应该多次调用 set key value还是 mset key1 value1 key2 value2一次设置多个呢?

在这里插入图片描述
整个操作的时间实际上等于往返时间+执行时间
对于执行时间来说两个操作是一样的,而对于往返时间还由数据量决定,所以还需考虑数据量再做决定;
如果是10000条数据使用多指令操作,往返时间很长,而又因为操作是单线程所以会阻塞影响性能
如果是50条数据,则完全可以使用多指令

4. 应用场景:

redis的所有操作都是原子性的,所有不会出现线程安全的问题

String通常用于保存单个字符串或JSON字符串数据

② 因String是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储

③ 计数器(常规key-value缓存应用。常规计数: 微博数, 粉丝数)
INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redisINCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。
假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。
不少网站都利用redis的这个特性来实现业务上的统计计数需求

5. string 类型数据的扩展操作使用场景

string 作为数值操作

问题
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键 id 必须保证统一性 ,不能重复。Oracle 数据库具有 sequence 设定,可以解决该问题,但是 MySQL数据库并不具有类似的机 制,那么如何解决?

解决方案
redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性,此方案适用于所有数据库,且支持数据库集群

特点
stringredis内部存储默认就是一个字符串,当遇到增减类操作incrdecr时会转成数值型进行计算

redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发 带来的数据影响。

注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)

② 时效问题

问题
“最强女生”启动海选投票,只能通过微信投票,每个微信号每 4 小时只能投1票

解决方案
设置数据具有指定的生命周期, redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

setex key seconds value  
psetex key milliseconds value 

6. key的命名规范

规范1
在这里插入图片描述

eg: user:id:3506728370:fans →     12210947 
eg: user:id:3506728370:blogs →     6164 
eg: user:id:3506728370:focuss →     83 

规范2
在redis中以json格式存储

eg: user:id:3506728370{"id":3506728370,"name":"晚","fans":12210862,"blogs":6164, "focus":83} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值