• Redis学习笔记(二)


    一、Redis数据类型

    Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)以及zset(有序集合)

    1、string(字符串)

      string是Redis最基本的数据类型,可以理解成与Memcached一样的类型,一个key对应一个value

      string是二进制安全的。意思是redis的string可以包含任何数据,包括jpg图片或者序列化的对象。

      string一个键最大能储存512MB。

    例子:

    127.0.0.1:6379> set var "String type"
    OK
    127.0.0.1:6379> get var
    "String type"

    说明:利用set给变量var赋值“String type”;再利用get获得变量var的值

    2、Hash(哈希)

      Hash是一个键值对集合

      Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

    hset & hget 例子:

    127.0.0.1:6379> hget set1 name
    "myhash"
    127.0.0.1:6379> hget set1 score
    "100"
    127.0.0.1:6379> hset set2 name myhash2
    (integer) 1
    127.0.0.1:6379> hset set2 score 110
    (integer) 1
    127.0.0.1:6379> hget set1 name 
    "myhash"

    hset&hget一次只能往哈希结构里面插入一个键值对,如果插入多个可以用hmset&hmget。

    hmset&hmget例子:

    127.0.0.1:6379> HMSET var:1  name jihite school pku
    OK
    
    127.0.0.1:6379> HGETALL var:1
    1) "name"
    2) "jihite"
    3) "school"
    4) "pku"

    说明:

      var:1是键值,每个hash可以存储232 - 1 键值对(40多亿)。

      Hmset用于建立hash对象,hgetAll用于获取hash对象

    hset vs hmset操作对比:

    127.0.0.1:6379> hset set5 name1 jihite1 name2 jihite2 name3 jihite3
    (error) ERR wrong number of arguments for 'hset' command
    127.0.0.1:6379> hmset set5 name1 jihite1 name2 jihite2 name3 jihite3
    OK
    127.0.0.1:6379> hget set5 name1
    "jihite1"
    127.0.0.1:6379> hmget set5 name1
    1) "jihite1"
    127.0.0.1:6379> hmget set5 name1 name2
    1) "jihite1"
    2) "jihite2"
    127.0.0.1:6379> hget set5 name1 name2
    (error) ERR wrong number of arguments for 'hget' command

    3、LIST(列表)

    例子

    127.0.0.1:6379> lpush lvar 1
    (integer) 1
    127.0.0.1:6379> lpush lvar a
    (integer) 2
    127.0.0.1:6379> lpush lvar ab
    (integer) 3
    
    127.0.0.1:6379> lrange lvar 0 1
    1) "ab"
    2) "a"
    127.0.0.1:6379> lrange lvar 0 10
    1) "ab"
    2) "a"
    3) "1"
    127.0.0.1:6379> lrange lvar 2 2
    1) "1"

    说明:

      lpush往列表的前边插入,lrange后面的数字是范围(闭区间)

      列表最多可存储232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

    4、Set(集合)

    Redis的set是string类型的无序集合

    集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)

    例子:

    127.0.0.1:6379> sadd setvar redis
    (integer) 1
    127.0.0.1:6379> sadd setvar mongodb
    (integer) 1
    127.0.0.1:6379> sadd setvar mongodb
    (integer) 0
    127.0.0.1:6379> sadd setvar rabbitmq
    (integer) 1
    127.0.0.1:6379> smembers setvar
    1) "rabbitmq"
    2) "redis"
    3) "mongodb"

    说明:

      set往集合中插入元素,smembers列举出集合的元素

      成功插入返回1;错误插入返回0,例子中mongdb第二次插入时,因为已经存在,故插入失败。

    5、zset(有序集合)

    zset和set一样也是String类型的集合,且不允许元素重复

    zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序。

    zset的元素是唯一的,但是分数是可以重复的。

    例子:

    127.0.0.1:6379> zadd zvar 1 redis
    (integer) 1
    127.0.0.1:6379> zadd zvar 1 redis
    (integer) 0
    127.0.0.1:6379> zadd zvar 2 redis
    (integer) 0
    127.0.0.1:6379> 
    127.0.0.1:6379> zadd zvar 2 mongo
    (integer) 1
    127.0.0.1:6379> zadd zvar 0 rabbitmq
    (integer) 1
    127.0.0.1:6379>  
    127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000
    1) "rabbitmq"
    2) "mongo"
    3) "redis"
    127.0.0.1:6379> 
    127.0.0.1:6379> 
    127.0.0.1:6379> zadd zvar -2 celery
    (integer) 1
    127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000
    1) "rabbitmq"
    2) "mongo"
    3) "redis"
    127.0.0.1:6379> ZRANGEBYSCORE zvar -3 1000
    1) "celery"
    2) "rabbitmq"
    3) "mongo"
    4) "redis"

    说明:

      成功插入返回1,插入失败返回0.插入已存在的元素失败,返回0.

      分数为float(可正、负、0)

    二、Redis HyperLogLog

      Redis HyperLogLog是用来做技术统计的算法。优点是在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

      在Redis里面,每个HyperLogLog键只需要花费12kB内存,就可以计算接近2^64个不同元素的基数。这河计算基数时,元素越多耗费内存就越多的集合形式形成鲜明对比。

      注意:因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,因此不会返回输入的各个元素。基数是什么?对于['abc','abc','2','3'],基数是['abc','2','3'],个数是3

    例子:

    localhost:6379> pfadd jsh redis
    (integer) 1
    localhost:6379> pfadd jsh redis
    (integer) 0
    localhost:6379> pfadd jsh mongodb
    (integer) 1
    localhost:6379> pfadd jsh rabbitmq
    (integer) 1
    localhost:6379> pfcount jsh
    (integer) 3
    localhost:6379> pfadd jsh2 redis
    (integer) 1
    localhost:6379> pfadd jsh2 a
    (integer) 1
    localhost:6379> pfcount jsh2
    (integer) 2
    
    localhost:6379> pfmerge jsh jsh2
    OK
    localhost:6379> pfcount jsh
    (integer) 4
    localhost:6379> pfcount jsh2
    (integer) 2

    说明:

      pfadd key ele [ele2 ...]:添加指定元素到HyperLogLog中,

      pfcount key:返回给定HyperLogLog的基数估算值

      pfmerge destkey srckey [srckey2 ...]:讲多个HyperLogLog合并到一个第一个HyperLogLog中。

    三、Redis发布订阅

    Redis 发布订阅(pub/sub)是一种消息通信模式:发布者(pub)发送消息,订阅者(sub)接收消息。

    Redis客户端可以订阅任意数量的频道。

    原理:下图展示了三个客户端client1、client2、client5订阅了频道channel1

    当有新消息通过PUBLISH发送给channel1时,这时候channel1就会把消息同时发布给订阅者

    例子,创建订阅频道redisChat:

    localhost:6379> subscribe redisChat
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "redisChat"
    3) (integer) 1

    打开客户端,订阅channel redisChat

    localhost:6379> psubscribe redisChat
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "redisChat"
    3) (integer) 1

    然后channel redisChat发送消息“hello world”

    localhost:6379> publish redisChat "Hello World"
    (integer) 1

    客户端会收到消息

    Reading messages... (press Ctrl-C to quit)
    1) "pmessage"
    2) "redisChat"
    3) "redisChat"
    4) "Hello World"

    四、Redis事务

    事务是一个单独的操作集合,事务中的命令有顺序,是一个原子操作(事务中的命令要么全部执行,要么全部不执行),操作一个事务中的命令时不会被其他命令打断。

    一个事务从开始到结束经过以下三个阶段:

      开始事务 》 命令入队 》 执行事务

    例子:

    localhost:6379> MULTI
    OK
    localhost:6379> set name jihite
    QUEUED
    localhost:6379> get name
    QUEUED
    localhost:6379> sadd language "c++" "python" "java"
    QUEUED
    localhost:6379> smembers language
    QUEUED
    localhost:6379> exec
    1) OK
    2) "jihite"
    3) (integer) 3
    4) 1) "java"
       2) "python"
       3) "c++"

    说明:事务以MULTI开始,以EXEC结束

    五、Redis脚本

    Redis脚本使用Lua解释器来执行脚本。执行脚本的常用命令为EVAL。基本语法:

    EVAL script numkeys key [key ...] arg [arg ...]

    例子

    localhost:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
    1) "key1"
    2) "key2"
    3) "first"
    4) "second"
  • 相关阅读:
    elasticsearch配置文件
    elk+filebeat源码安装
    logstash配置文件
    kibana配置文件
    filebeat配置文件
    老年人和棒子(李敖)
    Linux下傻瓜式安装配置V_2_r_a_y
    【有关学习Q国的自动化工具的学习思路】
    有关在使用aireplay-ng处理5Ghz频段的wifi时出现“No such Bssid available”的解决方法
    springboot整合日志logback
  • 原文地址:https://www.cnblogs.com/be-thebest/p/10397056.html
Copyright © 2020-2023  润新知