阿里云线上环境操作Redis

145 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


官网对Redis常见的数据结构定义为:
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

五大数据类型

String(字符串)

基本介绍

String可以说非常常见,程序员接触redis最先用到的应该就是String类型,使用该类型作为缓存。需要注意的是String类型的Value值可以是数字。常见使用场景是计数器,对象缓存等

命令实践

使用incr与decr命令实现自增与自减,实际场景用做浏览量等

字符串范围 range

替换,这里替换需要规则。

setex(set with expire) 设置过期时间 setnx(set if not exist) 不存在再设置(在分布式锁中会经常使用!)

批量创建key-value,批量获取key-value

\

重点 设置一个对象:set user:1 {name:zhangsan,age:3},设置一个user:1对象,值为json字符串来保存一个对象。 这里的设计是user:{id}:{filed},这样的设计在redis中是完全ok的了

先get后set 组合命令,可以用于更新操作

List(列表)

基本介绍

  1. 它实际是一个链表,before--Node--after
  2. 如果key不存在,创建新的链表;如果key存在,新增内容
  3. 如果移除了所有值,链表变空了,也代表不存在
  4. 在两边插入或修改值效率最高,中间元素,相对会低一点(LinkedList头插与尾插效率更高)
  5. 可以实现消息排队!消息队列 lpush rpop lpush rpop
  6. 在redis里面,list可以实现为栈,队列,阻塞队列
  7. 在String命令基础上,所有的list命令都以L开头代表list

命令实践

插入

\

移除元素 lpop,rpop

通过下标取值,第一个下标是0

\

查看list的长度 llen

移除指定的值,取关

\

String中有个trim方法,redis中有个ltrim命令可以实现截断

rpoplpush

\

lset {key} {index} {value},给list的某个索引位置设置值,替换值,是一个更新的操作。如果当前所以不存在就会失败

linsert,通过before/after来控制插入的位置

Set

基本介绍

  1. set的值是无序不重复
  2. 在String命令基础上,所有的命令都以s开头代表set

命令实践

添加元素,查询元素,判断元素是否存在

获取集合中的某个元素,移除set集合中的指定元素

srandmexx 获取一个随机值

随机移除一个key:spop

将一个指定的值移动到另一个集合

  • 差集:sdiff
  • 交集:sinter
  • 并集:sunion

脉脉,微博,微信等的共同关注,二度人脉等可以通过交并补来实现!

Hash

基本介绍

hash适合存储对象,经常变动的信息。String适合存储字符串即json 。redis的类型指的是后面的value。也就是说hash类型就是Map集合,它的value就是一个键值对相当于key:map。key本质和String类型没有太大区别,还是一个简单的String。

命令实践

Zset

基本介绍

  • zset是在set的基础上多了一个score,类似于排序的东西
  • 在String命令基础上,所有的list命令都以z开头代表zet

命令实践

添加一个元素,添加多个元素

使用场景: set排序 存储班级成绩表,工资表排序!

三种特殊类型

geospatial

基本介绍

geo底层实现原理是Zset,可以使用Zset命令来操作geo

命令实践

geoadd

  • 作用:添加地理位置
  • 规则:经度是有范围的(具体范围官网有)当坐标超出命令时,会报错
  • 在String命令基础上,所有的命令都以geo开头代表 geoadd

geopos:获得坐标值,可以取多个也可以取一个

geodist:查看两点之间的距离,有一点不存在就会有问题,可以指定单位,具体看官网

georadius: 以给定的经纬度为中心,找出指定半径内的元素(必须在key中)

georadiusbymember: 查询指定元素周围元素(类似于附近场馆)

geohash:返回一个或多个元素的geohash表示,该命令返回11位

hyperloglog

基本介绍

基数指的是不重复的元素,比如a集合是1,2,3,b几个是1,2.那么基数就是2,官方明确说明这里有误差,但是误差是可以接受的

简介

Redis2.8.9就有Hyperloglog这个数据结构,它是一种基数统计的算法。优点在于它占用的内存是固定的,2的64次方个元素,只需要12k的内存!相比于使用set(元素是唯一的)来实现一些功能,从内存角度,它是首选!

实际场景

网页的UV统计(一个人访问多次,也只算一次):

  • 传统方式:set保存用户的id,然后统计set中的元素数量即可。这个方式耗内存太大,我们的问题是要计数,不是存放数据。
  • redis:有0.81%的容错率,是可以接受的。

命令实践

bitmap

基本介绍

  1. Bitmaps是位图,是一种数据结构!都是操作二进制位来进行记录,就只有0跟1两个状态!
  2. 应用场景:统计用户信息(活跃,不活跃!登录,未登录!打卡,未打卡!)两个状态的,都可以使用Bitmaps!

命令实践