Redis 数据类型 String

String类型的使用

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

  • set
存:
set(self, name, value, ex=None, px=None, nx=False, xx=False)
取:
get(name)

在Redis中设置值,默认不存在则创建,存在则修改

参数:

  • ex,过期时间(秒)
  • px,过期时间(毫秒)
  • nx,如果设置为True,则只有key不存在时,当前set操作才执行,同#setnx(key, value)
  • xx,如果设置为True,则只有key存在时,当前set操作才执行
setex(self, name, value, time)
#设置过期时间(秒)

psetex(self, name, time_ms, value)
#设置过期时间(豪秒)

案例:


import redis
import time

red = redis.Redis(host='localhost',port=6379,db=1)

red.set('name1', 'xionger')
red.set('name2', 'xiongda', 3)  # 设置存储3秒钟
print(red.get('name1'))  # b'xionger'
print(red.get('name2'))  # b'xiongda'
time.sleep(4)
print(red.get('name2'))  # None
red.set('name1', 'gtq', nx=True)  # 若key存在,者不改变其值
print(red.get('name1'))  # b'xionger'
red.set('name1', 'gtq', xx=True)  # 若key存在,者改变其值
print(red.get('name1'))  # b'gtq'
  • mset
批量设置 以字典的形式
mset(self, *args, **kwargs)

案例:

red.mset({'k1': 'v1', 'k2':2})
print(red.get('k1'))  # b'v1'
print(red.get('k2'))  # b'2'
  • mget
获取多个值
mget(self, keys, *args)

案例:

在pyton里,结果是一个list
print(red.mget('k1', 'k2'))  # [b'v1', b'2']
  • getset
设置新值,并返回原来的值
getset(self, name, value)

案例:

print(red.getset('name1', 'xiyangyang'))  # b'gtq'
print(red.getset('name3', 'xiyangyang'))  # None  若原来没有值则返回None
print(red.get('name3'))  # b'xiyangyang'
  • getrange
对key的值进行切片操作
getrange(self, key, start, end)

案例:

print(red.getrange('name1', 0, 4))  # b'xiyan'
  • setrange
修改字符串内容,从指定字符串索引开始向后替换,若新值太长则向后添加
setrange(name, offset, value)

案例:

red.setrange('name1', 2, 'WWW')
print(red.get('name1'))  # b'xiWWWgyang'
  • strlen
返回key对应值的字节长度(一个汉字3个字节)
strlen(self, name)

案例:

print(red.strlen('name1'))  # 10
  • append
在name对应的值后面追加内容
append(name, value)

案例:

red.set("key","value")
print(red.get("key"))    #输出:'value'
red.append("key","one")
print(red.get("key"))    #输出:'valueone'
  • incr / incrby

设置数值数据增加指定范围的值

string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算

应用场景: 可以解决分表时防止ID重复出现的问题

注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。9223372036854775807

incr key
incrby key increment
incrbyfloat key increment

案例:

127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> get num
"10"
127.0.0.1:6379> incr num
(integer) 11
127.0.0.1:6379> get num
"11"
127.0.0.1:6379> incrby num 10
(integer) 21
127.0.0.1:6379> get num
"21"
  • decr / decrby

设置数值数据减少指定范围的值

decr key
decrby key increment

案例

127.0.0.1:6379> decr num
(integer) 20
127.0.0.1:6379> decrby num 10
(integer) 10
127.0.0.1:6379> get num
"10"

string类型涉及的问题及解决方案

  • set与mset的选择:

由于redis是单线程的,从服务器发送多条set指令到redis执行完毕返回信息比用mset指令操作的时间长

  • 解决MySQL数据库分表时ID重复问题

场景:

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

解决:

利用redis的incr指令

redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性

此方案适用于所有数据库,且支持数据库集群

  • 数据保留时间问题

场景:

最强女生”启动海选投票,只能通过微信投票,每个微信号每 4 小时只能投1票。
电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消热门。

新闻网站会出现热点新闻,热点新闻最大的特征是时效性,如何自动控制热点新闻的时效性

解决:

利用setex指令给数据设置生命周期时间

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

  • 热点时间信息的存储

场景: 主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量

解决:

redis应用于各种结构型和非结构型高热度数据访问加速

1.在redis中为大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可

set user:id:3506728370:fans  12210947
set user:id:3506728370:blogs  6164
set user:id:3506728370:focuss  83

2. 在redis中以json格式存储大V用户信息,定时刷新(也可以使用hash类型)

set user:id:3506728370 {"id":3506728370,"name":"春晚","fans":12210862,"blogs":6164, "focus":83}

补充:  

数据库中的热点数据key命名惯例

  • 应用于限时按次结算的服务控制

场景:

限制每个用户每分钟最多发起10次调用

解决方案:

设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用次数作为value
利用incr操作超过最大值抛出异常的形式替代每次判断是否大于最大值
遇到异常即视为使用达到上限
为计数器设置生命周期为指定周期,例如1秒/分钟,自动清空周期内使用次数

127.0.0.1:6379> setex user:00415 60 9223372036854775797
OK
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775798
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775799
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775800
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775801
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775802
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775803
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775804
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775805
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775806
127.0.0.1:6379> incr user:00415
(integer) 9223372036854775807
127.0.0.1:6379> incr user:00415
(error) ERR increment or decrement would overflow  抛出错误,即为达到10次

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值