出现的问题:
罪魁祸首——关系型数据库:
解决思路:
NoSQL:
即Not-OnlySQL(泛指非关系型的数据库),作为关系型数据库的补充。
特征:
常见Nosql数据库:
Redis(REmote DIctinary Server)是用C语言开发的一个开源的高性能键值对(key-value)数据库。
特征:
Redis下载安装视频教程
set key value
get key
del key
mset key1 value1 key2 value2 …
mget key1 key2 …
strlen key
append key value
业务场景
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复。Oracle数据库具有sequence设定,可以解决该问题,但是MySQL数据库并不具有类似的机制,那么如何解决?
电商系统中高并发怎么确保生成不重复的商品编号或者订单编号?
解决方案
# key的value值加1
incr key
# key的value值加increment,increment只能是整数
incrby key increment
# key的value值加increment,increment可以是小数
incrbyfloat key increment
# key的value值减1
decr key
# key的value值减increment,increment只能是整数
decrby key increment
String作为数值操作
业务场景
“最强女生”,启动海选投票,只能通过微信投票,每个微信号每4个小时只能投1票。
电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消热门
新闻网站会出现热点新闻,热点新闻最大的特征是对时效性,如何自动控制热点新闻的时效性
解决方案
设置数据具有指定的声明周期
setex key seconds value #单位秒
psetex key milliseconds value #单位毫秒
注意:通过setex 或 psetex设置具有时效性的数据后,如果通过set设置同样的key那么原数据会被覆盖,同时过期时间也会失效。
来自与表中的数据,建议使用以下命名规范
表名:主键名:主键值:字段名
如果存储的数据是频繁操作的对象类型,那么使用String类型就会显得很笨重。每次修改,即使是只修改一个属性,也需要取出整个对象的所有属性,修改后再全部保存进去,对IO的操作也是比较大的。
比如存储的是购物车对象,我只需要修改一下商品数量字段,最好的办法是我只取出这一个字段操作,String类型显然是做不到的,而Hash类型却可以做到。
hset key field value
hget key field
hgetall key
hdel key field1 [field2]
hmset key field1 value1 field2 calue2
hmget key field1 field2 …
hlen key
hexists key field
hkeys key
hvals key
hincrby key field increment
hincrbyfloat key field increment
当前设计是否加速了购物车的呈现
当前仅仅是将数据存储到redis中,并没有起到加速的所用,商品信息还需要二次查询数据库。
每条购物车中的商品记录保存成两条field
field1 专用于保存购买数量
1、命名格式:商品id:nums
2、保存数据:数值
field2 专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息灯还
1、命名格式:商品id:info
2、保存数据:json
优化后的涉及方案还有个问题,就是多个用户的购物车都有同一款商品时,redis中会有大量的重复商品信息。因此我们可以把field2的内容变成一个固定的hash独立出来。添加购物车的时候使用以下语句,保证同一个key下不会存在重复的数据。
hsetnx key field value
lpush key value1 [value2] …
rpush key value1 [value2] …
lrange key start stop #查询所有数据lrange key 0 -1
lindex key index
llen key
lpop key
rpop key
blpop key1 [key2] timeout
brpop key1 [key2] timeout
前面的b代表阻塞,意思就是在规定的时间内获取数据并移除,如果没数据会一直等到时间结束,如果等待过程中有数据了,会立马获取并移除。
lrem key count value
业务场景
微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息,如果取消点赞,移除对应好友信息
lrem key count value
其他业务场景
sadd key menber1 [member2]
smembers key
srem key member1 [member2]
scard key
sismember key member
业务场景
每位用户首次使用今日头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?
业务分析
解决方案
srandmember key [count]
spop key
Tips8:
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
smove source destination member
zadd key score1 member1 [score2 member2]
zrange key start stop [WITHSCORES] #升序
zrevrange key start stop [WITHSCORES] #降序
zrem key member [member …]
zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]
zremrangebyrank key start stop
zremrangebyscore key min max
zcard key
zcount key min max #score再min和max间有多少数据
zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]
注意:
zrank key member
zrevrank key member
zscore key member
zincrby key increment member
key特征
key应该设计那些操作?
del key
exists key
type key
#单位秒
expire key seconds
#单位毫秒
pexpire key milliseconds
#秒的时间戳
expireat key timestamp
#毫秒的时间戳
pexpireat key millinseconds-timestamp
#返回剩余秒数, -1:永久有效, -2:不存在
ttl key
#返回剩余毫秒数, -1:永久有效, -2:不存在
pttl key
persist key
keys pattern
#如果已经有newkey的数据,直接覆盖
rename key newkey
#如果已经有,则失败
renamenx key newkey
sort
help @generic
select index
quit
ping
echo message
move key db
dbsize #查询库里有多少key
flushdb #清除当前数据库所有数据
flushall #清除所有数据库所有数据