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次