Redis分布式缓存学习篇二之基础篇

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis分布式缓存学习篇二之基础篇

1.key值
  • keys:查看当前库中所有的key 。(不推荐使用)
keys *
有3个通配符 *, ? ,[]
*: 通配任意多个字符
?: 通配单个字符
[]: 通配括号内的某1个字符
  • exists:判断某个key是否存在,返回1表示存在,0不存在。(如果是多个,则返回存在的个数)
exists key
  • type:查看当前key 所储存的值的类型。返回当前key所储存的值的类型,如string 、list等。
type key

  • del:删除已存在的key,不存在的 key 会被忽略。
del key
  • expire:给key设置time秒的过期时间。设置成功返回 1 。 当 key 不存在返回 0。(适用于登录时,短信验证码)
expire key time
  • ttl:以秒为单位返回 key 的剩余过期时间
ttl key
tips:
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单
位,返回 key 的剩余生存时间。
  • persist:移除给定 key 的过期时间,使得 key 永不过期。
persist key
tips:
当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
2.设置key的值
  • 单一set: 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。
set key value
  • 多个mset:同时设置一个或多个 key-value 。
mset  k1  v1  k2  v2 ...
  • setnx:只有在key不存在时设置key的值
setnx key value
  • setex( set 和 expire的合体):给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命令将会替换旧的值,并设置过期时间。
setex key time value
eg:  setex k1 10 v1
3.获取key对应的值
  • 单一get:用于获取指定 key 的值。如果 key 不存在,返回 nil
get key
  • 多个mget:返回所有(一个或多个)给定 key 的值。(如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil )
mget k1 k2 k3
  • getset:将给定key值设为value,并返回key的旧值(old value)
getset key value
eg: 
127.0.0.1:6379> getset k1 wcc 
"v1"
127.0.0.1:6379> get k1 
"wcc"
4.其它常用
  • append:将给定的value追加到key原值末尾。(key存在且value是字符串才能追加,否则直接将给定key设为value)
append key value
  • getrange:获取指定区间范围内的值,类似between…and 的关系(从0开始算)
getrange key 2 4

setrange:给定一个开始,从该位置开始替换字符串。

setrange key offset value
eg:
127.0.0.1:6379> set k6 abcd1234 
OK
127.0.0.1:6379> setrange k6 1 xxx 
(integer) 8 
127.0.0.1:6379> get k6 
"axxx1234"

incr:将 key 中储存的数字值增一。(常用于计算浏览人数或者平台粉丝数等)

tips:如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。

incr key
decr:将 key 中储存的数字值减一。
decr key
  • incrby/decrby key step:将key存储的数字值按照step进行增减。
127.0.0.1:6379> incrby k1 10 (integer) 20
  • strlen:获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。
strlen key
使用场景
  • value 除了是字符串以外还可以是数字。
  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储
  • 分布式锁
二.Redis数据类型_List

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右

边)。底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。

一个list最多可以包含2^32 - 1个元素

常用命令

lpush/rpush key value1 value2 value3……
eg:
127.0.0.1:6379> lpush k1 v1 v2 v3 (integer) 3
  • lrange:返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示列表的第一个元素,-1表示

最后一个元素。

lrange key start end
#取出列表里前3个值,结果为v3 v2 v1 
127.0.0.1:6379> lrange k1 0 2
#取出列表里全部值,结果为v3 v2 v1 v4 v5 v6 
127.0.0.1:6379> lrange k1 0 -1
  • lpop/rpop:移除并返回第一个值或最后一个值。
lpop/rpop key
  • lindex:获取列表index位置的值(从左开始)。
lindex key index
eg:
lindex k1 0
  • llen: 获取列表长度
llen key
eg:
127.0.0.1:6379> llen k1 
(integer) 6
  • lrem: 从左边开始删除与value相同的count个元素。
lrem key count value
  • linsert:在列表中value值的前边/后边插入一个new value值(从左开始)
linsert key before/after value newvalue
eg:
linsert k1 before v1 v5 在v1前面插入一个v5
  • lset: 将索引为index的值设置为value
lset key index value
使用场景
  • 消息队列
  • 排行榜
  • 最新列表
三.Redis数据类型_set

与List类似是一个列表功能,但Set是自动排重的,String类型的无序集合,底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。

常用命令
  • sadd:将一个或多个元素添加到集合key中,已经存在的元素将被忽略。
sadd key v1 v2 ……
eg:
#向集合中添加值,最终只有v1 v2 v3 v4 v5 v6 
127.0.0.1:6379> sadd k1 v1 v2 v2 v3 v4 v5 v6
  • smembers: 取出该集合的所有元素。
smembers key
  • sismember:判断集合key中是否含有value元素,如有返回1,否则返回0。
sismember key value

2018122814580746.png

  • scard:返回该集合的元素个数
scard key
  • srem:删除集合中的一个或多个成员元素,不存在的成员元素会被忽略
srem key v1 v2……
  • spop:随机删除集合中一个元素并返回该元素。
spop key
  • srandmember:随机取出集合中count个元素,但不会删除。
srandmember key count
  • smove:将value元素从sourcekey集合移动到destinationkey集合中。
smove sourcekey destinationkey value
eg:
smove k1 k2 v5 将元素v5从集合k1中移动到集合k2
tips:如果 sourcekey集合不存在或不包含指定的 value元素,则 smove 命令不执行任何操作,仅返回
    0 。
  • sinter: 返回两个集合的交集元素。
sinter key1 key2
  • sunion: 返回两个集合的并集元素。
sunion key1 key2
  • sdiff:返回两个集合的差集元素(key1中的,不包含key2)
sdiff key1 key2
使用场景
  • 黑白名单
  • 随机展示
  • 好友
  • 关注人
  • 粉丝
  • 感兴趣的人集合
四.Redis数据类型_Hash

Hash是一个键值对的集合。Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash

特别适合用于存储对象。

Hash存储结构优化:如果field数量较少,存储结构优化为类数组结构;如果field数量较多,存储结构使用HashMap结构。

常用命令
  • hset:给key集合中的field赋值value。
hset key field value
tips:如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
      如果字段已经存在于哈希表中,旧值将被重写。

2018122814580746.png

  • hget:从key哈希中,取出field字段的值。
hget key field
  • hmset:批量设置哈希的字段及值(hset也是可以批量设置的)
hmset key field1 value1 field2 value2……
eg:
127.0.0.1:6379> hmset user1 name baizhan age 15
OK
  • hexists:判断指定key中是否存在field
hexists key field
tips: 如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。
  • hkeys:获取该哈希中所有的field
hkeys key
  • hvals key:获取该哈希中所有的value
hvals key
  • hincrby:为哈希表key中的field字段的值加上增量increment。
hincrby key field increment
tips:
增量也可以为负数,相当于对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。

2018122814580746.png

  • hdel:删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。
hdel key field1 field2……
  • hsetnx:给key哈希表中不存在的的字段赋值 。
hsetnx key field value
tips:
如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令
使用场景
  • 购物车
  • 存储对象
五.Redis数据类型_Zset

Zset与Set非常相似,是一个没有重复元素的String集合。不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复

常用命令
  • zadd:将一个或多个元素(value)及分数(score)加入到有序集key中。
zadd key score1 value1 score2 value2……
eg:
zadd k1 100 java 200 c++ 300 python 400 php 
eg:
如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元
素,来保证该元素在正确的位置上。
分数值可以是整数值或双精度浮点数。
如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作

2018122814580746.png

  • zrange:返回key集合中的索引start和索引end之间的元素(包含start和end)。[withscores]携带分数
zrange key start end [withscores]

2018122814580746.png

  • zrangebyscore:返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元 素的位置按分数值递增(从小到大)来排序。
zrangebyscore key minscore maxscore [withscores]
eg:
zrangebyscore k1 200 400 返回200-400分之间的元素递增排序

2018122814580746.png

  • zincrby:为元素value的score加上increment的值。
zincrby key increment value
  • zrem:删除该集合下value的元素。
zrem k1 php 删除php
  • zcount:统计该集合在minscore 到maxscore分数区间中元素的个数。
zcount key minscore maxscore
  • zrank:返回value在集合中的排名,从0开始
zrank key value
使用场景
  • 延时队列
  • 排行榜
  • 限流
六.Redis数据类型_Bitmaps
七.Redis数据类型Geospatia

GEO,Geographic,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该

类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

常用命令
  • geoadd:用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
geoadd key longitude latitude member
eg:
# 将北京的经纬度和名称添加到china 
geoadd china 116.405285 39.904989 beijing 
# 将成都和上海的经纬度、名称添加到china 
geoadd china 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai
  • geopos: 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil
geopos key member [member ……]
  • geodist:用于返回两个给定位置之间的距离
geodist key member1 member2 [m|km|ft|mi]
  • georadius:以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的所有位置元素。
georadius key longitude latitude radius m|km|ft|mi
使用场景
  • 附近的电影院
  • 附近的好友
  • 离最近的火锅店
七.Redis数据类型_Hyperloglog

比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数(不重复元素)为5.基数估计就是在

误差可接受的范围内,快速计算基数。

常用命令

pfadd: 将所有元素参数添加到 Hyperloglog 数据结构中,如果至少有一个元素被添加返回 1, 否则返回 0。

pfadd key element1 element2……

pfcount:计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。

pfcount key1 key2……

pfmerge:将一个或多个Hyperloglog(sourcekey1) 合并成一个Hyperloglog (destkey )。

pfmerge destkey sourcekey1 sourcekey2……

使用场景

基数不大,数据量不大就用不上,会有点大材小用浪费空间,有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么,和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmaps 方便很多,一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃。

  • 网站PV统计
  • 网站UV统计
  • 统计访问量(IP数)
  • 统计在线用户数
  • 统计每天搜索不同词条的个数
  • 统计文章真实阅读数
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
30天前
|
NoSQL Java Redis
如何通俗易懂的理解Redis分布式锁
在多线程并发的情况下,我们如何保证一个代码块在同一时间只能由一个线程访问呢?
38 2
|
1天前
|
存储 缓存 NoSQL
Redis入门到通关之Redis缓存数据实战
Redis入门到通关之Redis缓存数据实战
|
2天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
3天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
136 10
|
10天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
|
18天前
|
存储 缓存 NoSQL
使用redis进行缓存加速
使用redis进行缓存加速
27 0
|
19天前
|
存储 缓存 NoSQL
Java手撸一个缓存类似Redis
`LocalExpiringCache`是Java实现的一个本地缓存类,使用ConcurrentHashMap存储键值对,并通过ScheduledExecutorService定时清理过期的缓存项。类中包含`put`、`get`、`remove`等方法操作缓存,并有`clearCache`方法来清除过期的缓存条目。初始化时,会注册一个定时任务,每500毫秒检查并清理一次过期缓存。单例模式确保了类的唯一实例。
16 0
|
1月前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
46 1
|
1月前
|
存储 缓存 NoSQL
[Redis]——缓存击穿和缓存穿透及解决方案(图解+代码+解释)
[Redis]——缓存击穿和缓存穿透及解决方案(图解+代码+解释)
256 0
|
1月前
|
缓存 NoSQL 数据库
[Redis]——数据一致性,先操作数据库,还是先更新缓存?
[Redis]——数据一致性,先操作数据库,还是先更新缓存?

热门文章

最新文章