redis八种基本数据类型及其应用

NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。

Redis 系列:

1、Redis 的五大数据类型

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name xxx
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 1
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> exists name

Redis 有以下 5 种基本的数据类型

127.0.0.1:6379> set key1 v1

自增、自减

127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views

字符串范围

127.0.0.1:6379> set key1 "hello,world!"
OK
127.0.0.1:6379> get key1
"hello,world!"
127.0.0.1:6379> getrange key1 0 3

替换:

127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xx
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
127.0.0.1:6379>

setex(set with expire):设置过期时间

setnx(set if not exist):不存在再设置(在分布式锁中会经常使用)

127.0.0.1:6379> setex key3 30 "hello"

msetmget

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
set user:1 {name:zhangsan, age:3}

getset:先 get 再 set

127.0.0.1:6379> getset db redis

String 的使用场景:value 除了是字符串以外还可以是数字

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

基本的数据类型,列表。

在 Redis 中可以把 list 用作栈、队列、阻塞队列。

list 命令多数以 l开头。

127.0.0.1:6379> lpush list one

弹出 pop

127.0.0.1:6379> lrange list 0 -1
1) "!"
2) "world"
3) "world"
4) "hello"
127.0.0.1:6379> lpop list

索引 Lindex

127.0.0.1:6379> lrange list 0 -1
1) "hjk"
2) "world"
3) "world"
127.0.0.1:6379> lindex list 1

Llen 长度:

127.0.0.1:6379> llen list
(integer) 3
127.0.0.1:6379>

移除指定的值:

127.0.0.1:6379> lrange list 0 -1
1) "hjk"
2) "world"
3) "world"
127.0.0.1:6379> lrem list 1 world

trim 截断

127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
4) "hello4"
127.0.0.1:6379> ltrim mylist 1 2

rpoplpush :移除列表的最后一个元素,将他移动到新的列表中。

127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
3) "hello3"
127.0.0.1:6379> rpoplpush mylist myotherlist

lset:将列表中指定下标的值替换为另一个值,更新操作

127.0.0.1:6379> exists list

linsert:将某个具体的value插入到列表中某个元素的前面或者后面

127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
127.0.0.1:6379> linsert mylist before "hello2" hello
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello"
3) "hello2"
127.0.0.1:6379> linsert mylist after "hello2" hello
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello"
3) "hello2"
4) "hello"
127.0.0.1:6379>

小结:

  • list 实际上是一个链表,前后都可以插入
  • 如果key不存在,创建新的链表
  • 如果移除了所有的值,空链表,也代表不存在
  • 在两边插入或者改动值,效率最高。
127.0.0.1:6379> sadd myset "hello"
127.0.0.1:6379> scard myset
127.0.0.1:6379> smembers myset
1) "kkk"
2) "world"
3) "hjk"
4) "hello2"
127.0.0.1:6379> srandmember myset
127.0.0.1:6379> smembers myset
1) "kkk"
2) "world"
3) "hjk"
4) "hello2"
127.0.0.1:6379> spop myset
127.0.0.1:6379> smembers myset
1) "kkk"
2) "world"
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 "kkk"
127.0.0.1:6379> smembers key1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sdiff key1 key2

也是 key – value 形式的,但是value 是一个map。

127.0.0.1:6379> hset myhash field xxx
127.0.0.1:6379> hdel myhash field1
127.0.0.1:6379> hlen myhash
127.0.0.1:6379> hset myhash field3 5
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1

Hash 适合存储经常变动的对象信息,String 更适合于存储字符串。

127.0.0.1:6379> zadd myset 1 one

实现排序:

127.0.0.1:6379> zadd salary 2500 xiaohong
(integer) 1
127.0.0.1:6379> zadd salary 5000 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 500 xaiozhang
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xaiozhang"
2) "xiaohong"
3) "xiaoming"
127.0.0.1:6379> zrangebyscore salary -inf +inf
127.0.0.1:6379> zrange salary 0 -1
1) "xaiozhang"
2) "xiaohong"
3) "xiaoming"
127.0.0.1:6379> zrem salary xiaohong
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 !
(integer) 2
127.0.0.1:6379> zcount myset 1 3

2、Redis 三种特殊数据类型

Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。

geoadd 添加地理位置

规则:两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。

有效的经度从 -180 度到 180 度。有效的纬度从 -85.05112878 度到 85.05112878 度。当坐标位置超出指定范围时,该命令将会返回一个错误。

(error) ERR invalid longitude latitude pair xxx yyy

添加一些模拟数据:

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shengzhen
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2
127.0.0.1:6379>

geopos 获得当前定位坐标值

127.0.0.1:6379> geopos china:city beijing

geodist 获取两个位置之间的距离

单位:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

127.0.0.1:6379> geodist china:city beijing shanghai km

georedius 以给定的经纬度为中心,找出某一半径内的元素

127.0.0.1:6379> georadius china:city 110 30 1000 km

GEORADIUSBYMEMBER 找出位于指定元素周围的其他元素

127.0.0.1:6379> georadiusbymember china:city shanghai 1000 km
1) "hangzhou"
2) "shanghai"
127.0.0.1:6379>

geo 底层实现原理其实就是 zset ,可以使用 zset 命令操作 geo

127.0.0.1:6379> zrange china:city 0 -1
1) "chongqing"
2) "xian"
3) "shengzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing

基数:数学上集合的元素个数,是不能重复的。

UV(Unique visitor):是指通过互联网访问、浏览这个网页的自然人。访问的一个电脑客户端为一个访客,一天内同一个访客仅被计算一次。

Redis 2.8.9 版本更新了 hyperloglog 数据结构,是基于基数统计的算法。

hyperloglog 的优点是占用内存小,并且是固定的。存储 2^64 个不同元素的基数,只需要 12 KB 的空间。但是也可能有 0.81% 的错误率。

这个数据结构常用于统计网站的 UV。传统的方式是使用 set 保存用户的ID,然后统计 set 中元素的数量作为判断标准。但是这种方式保存了大量的用户 ID,ID 一般比较长,占空间,还很麻烦。我们的目的是计数,不是保存数据,所以这样做有弊端。但是如果使用 hyperloglog 就比较合适了。

127.0.0.1:6379> pfadd mykey a b c d e f g h i j

bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。

bitmap 常用于统计用户信息比如活跃粉丝和不活跃粉丝、登录和未登录、是否打卡等。

这里使用一周打卡的案例说明其用法:

127.0.0.1:6379> setbit sign 0 1

查看某一天是否打卡:

127.0.0.1:6379> GETBIT sign 3
(integer) 1
127.0.0.1:6379> GETBIT sign 6
(integer) 0
127.0.0.1:6379>

统计:统计打卡的天数

127.0.0.1:6379> BITCOUNT sign
(integer) 4
127.0.0.1:6379>

Original: https://www.cnblogs.com/yanglang/p/13560652.html
Author: 杨浪
Title: redis八种基本数据类型及其应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528884/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 07_Linux基础-计划任务-备份脚本-变量定义和使用

    07_Linux基础-计划任务-备份脚本-变量定义和使用 一. 计划任务 主要内容:周期性的计划任务crontab/var/spool/cron/ 统一存放计划任务的目录/var/…

    Linux 2023年6月6日
    091
  • 在海思芯片上使用GDB远程调试

    使用海思平台上(编译工具链:arm-himix200-linux)交叉编译 GDB 工具(使用版本8.2,之前用过10.2的版本,在编译 gdbserver 遇到编译出错的问题,因…

    Linux 2023年6月7日
    0149
  • redis五种数据类型及使用场景

    一、Redis简介Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。它可以用作数据库、缓存和消息中间件。它支持的数据类…

    Linux 2023年5月28日
    090
  • HTML基础笔记整理

    「学习笔记」HTML基础 勤做笔记不仅可以让自己学的扎实,更重要的是可以让自己少走弯路。有人说:”再次翻开笔记是什么感觉”,我的回答是:”初恋般…

    Linux 2023年6月13日
    086
  • 来的随笔

    感谢各位 posted @2022-01-07 12:08 三途河畔人 阅读(71 ) 评论() 编辑 Original: https://www.cnblogs.com/sthp…

    Linux 2023年6月7日
    0115
  • 【Leetcode】198. 打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动…

    Linux 2023年6月6日
    0103
  • 软件工程 统一过程软件(RUP) 第5篇随笔

    1.RUP简介 本质: 是”一般的过程框架” 为软件开发,进行不同抽象层之间”映射”,安排其开发活动的次序,指定任务和需要开发的志平…

    Linux 2023年6月7日
    0125
  • 在 Windows 搭建 SVN 服务

    以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」 https://mp.weixin.qq.com/s/JIKNVuH5FIwEQMnYGxmRiQ …

    Linux 2023年6月6日
    0144
  • PySimpleGUI 踩坑记

    最近在写一些处理芯片数据的代码,想给小伙伴们用,就想到写个GUI的页面,正好有人推荐使用PySimpleGUI, 首次使用就遇到了坑: 之前没有加try,运行的时候直接报错 inv…

    Linux 2023年6月14日
    092
  • 软件基础的理论(1)

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    Linux 2023年6月7日
    092
  • Linux机器自建账号并赋予sudo权限,同时修改远程端口

    默认使用root账号来操作Linux有一定风险,因此需要自建账号并赋予sudo权限,方便使用 登录为root用户后,创建账号 adduser <username>&lt…

    Linux 2023年6月6日
    0141
  • 文本操作find cut sort wc sed awk

    文本操作 查找文件: # find 大概位置 以名字查找 名字 find /etc/ -name i18n find /etc/ -name 70* find /etc/ -nam…

    Linux 2023年6月11日
    098
  • Linux CURL的安装和使用

    –获得安装包,从网上直接下载或者其他途径,这里直接wgetwget http://curl.haxx.se/download/curl-7.17.1.tar.gz&#8…

    Linux 2023年6月13日
    090
  • Redis阻塞操作实现原理(转)

    原文:https://www.jianshu.com/p/xsMzfn 作者:Haiger 最近一位朋友问到:既然Redis是单线程的工作模式,那像 _BLPOP_这样的阻塞操作又…

    Linux 2023年5月28日
    0103
  • MySQL注入流程

    确认注入点 信息收集 数据获取 提权 写个MySQL注入流程的大纲,类似一份全局地图,能指导下一步工作。MySQL注入流程分为四步: 确认注入点 信息收集 数据获取 提权 确认注入…

    Linux 2023年6月6日
    0128
  • Linux 常用命令总结(三)

    一、实用命令 1、crontab(定时任务) (1)基本概念crontab 是用来管理定时任务的命令。系统启动后,将会自动调用 crontab,如果存在任务,则根据相关定义去执行。…

    Linux 2023年5月27日
    0122
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球