• Redis笔记基础篇:6分钟看完Redis的八种数据类型


    目录

    • 一、常识补充

    • 二、安装

    • 三、启动redis

    • 四、常用基础命令

    • 五、Redis五大基本数据类型

      • 5.1、String

      • 5.2、Hash

      • 5.3、List

      • 5.4、Set

      • 5.5、Zset

    • 六、三大特殊数据类型

      • 6.1、geospatial

      • 6.2、Hyperloglog

      • 6.3、Bitmap

    一、常识补充

    点击进入redis官网

         redis简介(Remote dictionary Server 远程字典服务器):

    Redis是开源免费的,由C语言编写的,一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的Nosql数据库,也被称为" 数据结构服务器 "。

    提前剧透,redis关于key-value的三大特点:

    1. redis是支持持久化的!我们可以控制数据何时、用何种方式保存到磁盘中,每次重启再次加载该文件,可以完成数据恢复。

    2. redis不单单支持简单的key-value数据类型,同时还可以提供list、set、hash、zset等数据类型的存储

    3. 支持数据的备份。mater-slave模式,即,当下时髦的主从复制读写分离。

    应用场景:

    • 内存存储的持久化: 虽然redis是单线程实现的,但是支持异步将数据持久化到硬盘上,同时不影响继续服务。

    • 发布订阅

    • 定时器、计时器: 我们可以把这个特性用到发短信的服务中,每次发送完短信后,就进入倒计时。在指定的时间内拒绝发送第二次,可以有效的缓解短信服务的压力,节流。

    • 取出最新的N个数据的操作: 比如新浪微博的评论系统,他要展示最新的10条评论,就是把最新的10条评论的id放到redis的list里面。

    二、安装

    去官网下载压缩包:https://redis.io/download

    安装依赖、编译、安装:

    1. 1[root@instance-lynj0v9k-19 redis-5.0.9]# yum install gcc-c++
    2. 2[root@instance-lynj0v9k-19 redis-5.0.9]# make
    3. 3[root@instance-lynj0v9k-19 redis-5.0.9]# make install

    我们自己安装的程序默认都在  /usr/local/bin目录下

    三、启动redis

    将redis的配置文件拷贝到/usr/local/bin目录下,之后使用这个配置文件启动。

    修改配置文件,让redis后台启动。

    1daemonize no # 修改成 yes
    

    指定配置文件,启动redis。

    1redis-server /绝对路径/redis.conf
    

    使用redis-client连接redis。

    1redis-cli -h 地址 -p 端口号
    

    退出

    1. 1# 关闭redis-server
    2. 2127.0.0.1:16379shutdown
    3. 3
    4. 4# 退出redis-cli
    5. 5not connected> exit
    6. 6
    7. 7# 重新尝试连接,因为redis-server被关闭了,所以会被拒绝
    8. 8[root@instance-lynj0v9k-19 bin]# redis-cli -p 16379
    9. 9Could not connect to Redis at 127.0.0.1:16379: Connection refused
    10. 10not connected> exit
    11. 11
    12. 12# 查看redis-server是否还在
    13. 13[root@instance-lynj0v9k-19 bin]# netstat -luntp | grep 16379
    14. 14[root@instance-lynj0v9k-19 bin]#

    四、常用基础命令

    点击查看所有命令

    1. 1# redis默认存在16个数据库,默认一开始使用的是第0个
    2. 2[root@instance-lynj0v9k-19 bin]# cat redis.conf | grep  'databases'
    3. 3databases 16
    4. 4
    5. 5# 切换数据库
    6. 6127.0.0.1:16379select 2
    7. 7OK
    8. 8127.0.0.1:16379[2]>
    9. 9
    10. 10# 查看数据库容量
    11. 11127.0.0.1:16379[2]> DBSIZE
    12. 12(integer) 0
    13. 13
    14. 14# 查看所有的key
    15. 15127.0.0.1:16379[2]> keys *
    16. 16(empty list or set)
    17. 17
    18. 18# 清空当前数据库中的值
    19. 19127.0.0.1:16379[2]> flushdb
    20. 20OK
    21. 21
    22. 22# 清空所有库
    23. 23127.0.0.1:16379[2]> flushall
    24. 24OK
    数据库的相关命令指令
    关闭redisshutdown
    选择数据库select 库索引
    查看当前数据库中key的数量Dbsize
    清空当前库Flushdb
    通杀所有库Flushall
    key常用命令指令
    查看所有keykeys *
    判断某个key是否存在exists key
    把key移动到别的库move key db
    为key 设定过期时间expire key  秒钟
    查看还有多少秒过期ttl key
    查看当前key是什么类型的type key

    五、Redis五大基本数据类型

    5.1、String

    等同于java中的,Map

    • string 是redis里面的最基本的数据类型,一个key对应一个value。

    • string 是二进制安全的,意味着:就算我们通过加密算法把图片或者序列化的对象set给redis,它帮我们安全的存储。

    • string的最大内存值 512M

    常用命令:

    常用命令命令
    添加一对kvset key value
    添加多对kv(可覆盖)mset key value key value….
    添加多对kv(不可覆盖,只要有一个已存在,全部取消)msetnx key value key value….
    获取get value
    获取多对kvmget key key…
    删除del  key
    在末尾追加append key value
    查询v的长度strlen key
    给数值类型的v加/减1incr/decr key
    给数值类型增加/减少指定大小的值incrby/decrby key value
    获取v的长度getrange key
    在指定位置添加指定值(中间默认用空格补全)setrange key offset value
    添加指定生命周期的kvsetex key seconds value
    如果不存在则添加setnx key value
    获取旧值,设置新值setget key value

    5.2、Hash

    等同于java中的:Map>

    • redis的hash是一个键值对的集合  Map(string, Object)。

    • redis的hash是一个string类型的field和value的映射表,特别适合存储对象。

    同样hash相关的指令以 h  开头

    作用命令
    添加单个hset key field value
    获取单个hget key field
    一次性添加多个键值hmset key field1 value1 field2 value2 …
    一次性获取多个hmget
    获取所有键值hgetall key
    删除hdel
    获取键值对的个数hlen
    检查是否包含某个字段hget key field
    查看所有keyhkeys
    给某个数值类型(否则报错)的值增加指定整数值hincrby key field increment
    给某个数字类型值,增加指定浮点类型值hincrbyfloat  key field increment
    如果不存在则添加hsetnx

    5.3、list

    等同于java中的Map>

    redis的list是一个简单的字符串类型的列表,从功能上看, 它就像是栈和队列结婚后的产物 首先:  它会按照我们插入的顺序排序,然后我们可以从他的头部添加/获取元素,也可以从它的尾部添加/获取元素, (底层实际上是个链表)

    list中有比较容易混淆的左右之分,我是把整个list看成一个两边相同的管子,如果是L开头的操作,就想象用左手把这个管子竖起来(我取名字叫左压栈),如果是R开头,就想象是右手把这个管子竖起来,这样就不会混淆取出来的值到底是谁。

    list相关的指令,开头全部是 l,表示list

    常用命令命令
    左压栈lpush key v1 v2 v3 v4…
    右压栈rpush key v1 v2 …
    查看里面的元素lrange key start offset
    左弹栈lpop key
    右弹栈rpop key
    按照索引查找lindex key index
    查看长度llen key
    删除几个几lrem key 数量 value
    指定开始和结束的位置截取,再赋值给keyltrim key start offset
    右出栈左压栈,把resoure的左后一个,压倒dest的第一个rpoplpush resource destination
    重置指定索引的值lset key index value
    在指定元素前/后插入指定元素linsert key before/after 值1 值2

    性能总结:

    他是一个字符串链表,left、right都可以插入添加。

    • 如果键不存在,创建新的链表。

    • 如果键已经存在,新增内容。

    • 值全部移除,key消失。

    • 由于是链表,所以它对头和尾操作的效率都极高。但是假如是对中间元素的操作,效率就可怜了。

    5.4、Set

    等同于java中的Map>

    第一眼看到set,有没有想起来,它不允许有重复的元素? 没错,它的底层由hashTable实现的,天生去重。

    Set的所有指令,全部以 s 开头。

    常用命令命令
    添加值sadd key values
    查看值smembers key
    检查集合是否有值sismember key value
    查看set集合里面的元素个数scard key
    删除集合中的指定元素srem key value
    随机弹出某个元素srandmember key
    随机出栈spop key
    把key1中的某个值赋值给key2smove SourceSet destSet member
    数学集合类命令
    差集sdiff
    交集sinte
    并集sunion

    5.5、Zset

    (sorted set: 有序集合)sort_set:可排序的set

    • 首先: 它同样具有set的特性,去重!

    • 其次: 每一个元素的value之前会关联上一个double类型的分数。redis会按照分数的成员,从小到大进行排序.(分数可以重复)  据说:我们平时玩的游戏得分排行榜就是它搞的。

    set的值是 k1 v1 k2 v2
    zset的值  K1 score v1 k2 score v2

    六、三大特殊数据类型

    6.1、geospatial

    官网地址:https://redis.io/commands/geoadd

    可以用来推算两地之间的距离,方圆半径内的人。

    关于经度纬度的限制:https://www.redis.net.cn/order/3685.html

    1. 1# 添加三个城市
    2. 2127.0.0.1:16379[2]> geoadd china:city 116.40  39.99 beijing
    3. 3(integer) 1
    4. 4127.0.0.1:16379[2]> geoadd china:city 117.190 39.1255 tianjin
    5. 5(integer) 1
    6. 6127.0.0.1:16379[2]> geoadd china:city 120.36955 36.094 qingdao
    7. 7(integer) 1
    8. 8127.0.0.1:16379[2]>
    9. 9
    10. 10# 获取指定key的经度和纬度
    11. 11127.0.0.1:16379[2]> geopos china:city beijing
    12. 121) 1) "116.39999896287918091"
    13. 13   2) "39.99000043587556519"
    14. 14127.0.0.1:16379[2]>
    15. 15
    16. 16# 获取两个给定位置的距离
    17. 17127.0.0.1:16379[2]> geodist china:city beijing qingdao # 默认单位为米
    18. 18"555465.2188"
    19. 19127.0.0.1:16379[2]> geodist china:city beijing qingdao km
    20. 20"555.4652"
    21. 21127.0.0.1:16379[2]> geodist china:city beijing qingdao m
    22. 22"555465.2188"
    23. 23127.0.0.1:16379[2]> geodist china:city beijing qingdao mi # 英里
    24. 24"345.1509"
    25. 25127.0.0.1:16379[2]> geodist china:city beijing qingdao ft # 英尺
    26. 26"1822392.4503"
    27. 27
    28. 28# 查找附近的人
    29. 29# 以给定的经纬度为中心,找出某一半径内的元素
    30. 30127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km # 半径为200km
    31. 311) "tianjin"
    32. 322) "beijing"
    33. 33127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km withdist # 指定显示距离
    34. 341) 1) "tianjin"
    35. 35   2) "0.0001"
    36. 362) 1) "beijing"
    37. 37   2) "117.6221"
    38. 38127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km count 2 # 指定显示2个结果
    39. 391) 1) "tianjin"
    40. 40   2) "0.0001"
    41. 412) 1) "beijing"
    42. 42   2) "117.6221"
    43. 43
    44. 44# 以指定的members为依据,找到它指定范围内的元素
    45. 45127.0.0.1:16379[2]> GEORADIUSBYMEMBER china:city beijing 120 km
    46. 461) "beijing"
    47. 472) "tianjin"
    48. 48
    49. 49# 返回一个或者多个位置的11位长度的hash串表示
    50. 50127.0.0.1:16379[2]> geohash china:city beijing
    51. 511) "wx4g2xzyss0"
    52. 52127.0.0.1:16379[2]> geohash china:city beijing tianjin
    53. 531) "wx4g2xzyss0"
    54. 542) "wwgqddx4sc0"
    55. 55
    56. 56# geo底层使用 zset 实现
    57. 57127.0.0.1:16379[2]> ZRANGE china:city 0 -1
    58. 581) "qingdao"
    59. 592) "tianjin"
    60. 603) "beijing"
    61. 61
    62. 62# 可以通过zrem删除 geo添加的key中的member
    63. 63127.0.0.1:16379[2]> ZREM china:city beijing
    64. 64(integer) 1
    65. 65127.0.0.1:16379[2]> ZRANGE china:city 0 -1
    66. 661) "qingdao"
    67. 672) "tianjin"

    6.2、Hyperloglog

    一般我们使用Hyperloglog做基数统计。

    什么是基数?就是一个集合中不重复的数的个数。

    集合A:{1,3,5,7,9,7}

    集合B:{1,3,5,7,9}

    AB集合的基数都是5

    应用:统计网站的访问量(一个人访问网站很多次仍然算作一次)。

    优点:占用的内存是固定的,找2^64次方个数的基数,只需要12KB内存。

    缺点:有0.81%的错误率,可以忽略不计

    1. 1# PFCOUNT 计算出来的数量就是Set的基数
    2. 2127.0.0.1:16379[2]> PFADD key4 q w e r q
    3. 3(integer1
    4. 4127.0.0.1:16379[2]> PFCOUNT key4
    5. 5(integer4
    6. 6
    7. 7# 添加key1和key对应的多个值
    8. 8127.0.0.1:16379[2]> PFADD key1 q w e r
    9. 9(integer1
    10. 10
    11. 11# 统计key下有多少个值
    12. 12127.0.0.1:16379[2]> PFCOUNT key1
    13. 13(integer4
    14. 14
    15. 15# 添加key2和key对应的多个值
    16. 16127.0.0.1:16379[2]> PFADD key2 a s d f
    17. 17(integer1
    18. 18
    19. 19# 合并多个key成为一个key
    20. 20127.0.0.1:16379[2]> PFMERGE key3 key1 key2
    21. 21OK
    22. 22127.0.0.1:16379[2]> PFCOUNT key3
    23. 23(integer8

    6.3、Bitmap

    比如使用bitmap记录用户从1号到3号到登陆信息

    1. 1# key为sign表示登陆
    2. 2127.0.0.1:16379[2]> SETBIT sign 1 0 # 第一天没有登陆
    3. 3(integer) 0
    4. 4127.0.0.1:16379[2]> SETBIT sign 2 0
    5. 5(integer) 0
    6. 6127.0.0.1:16379[2]> SETBIT sign 3 1 # 第三天登陆了
    7. 7(integer) 0
    8. 8
    9. 9# 获取指定某位的值
    10. 10127.0.0.1:16379[2]> GETBIT sign 3
    11. 11(integer) 1
    12. 12
    13. 13# 统计用户这三天登陆了几次,就是统计key下有多少位1
    14. 14127.0.0.1:16379[2]> GETBIT sign 3
    15. 15(integer) 1
    16. 16127.0.0.1:16379[2]> bitcount sign
    17. 17(integer) 1

  • 相关阅读:
    广东海颐开发笔试编程题回顾
    PPT设置为本框的默认格式以及固定文本框
    Programming Differential Privacy第十一章The Sparse Vector Technique稀疏向量技术
    大数据安全 | (一)介绍
    RocketMQ、Kafka、RabbitMQ 消费原理,顺序消费问题【图文理解】
    K8S常见的持久化(存储)方案用法详解
    【Java】接口
    [附源码]java毕业设计构建养猪场管理系统
    马来西亚《星报》:在WTO MC12 孙宇晨仍在坚持数字经济梦想
    【C++入门】命名空间&缺省参数&函数重载&引用
  • 原文地址:https://blog.csdn.net/weixin_72753070/article/details/126084892