一站式学习Redis, 从入门到高可用分布式实践-01redis初识、02api的理解和使用

01-redis初识

  1. redis8大特性
    速度快、持久化、多种数据结构、支持多种编程语言、功能丰富、简单、主从复制、高可用/分布式

  2. 计算机组成原理

    从上到下依次是:寄存器、一级缓存、二级缓存、内存、本地硬盘、远程硬盘
    速度是越来越慢的

  3. redis多种数据结构
    string、hash、list、set、zset
    bitmaps: 位图
    hyperloglog: 超小内存唯一值计数
    geo: 地理信息定位

  4. redis典型应用场景

  • 缓存系统

  • 计数器

  • 消息队列系统

  • 排行榜

  • 社交网略

  • 实时系统

  1. redis启动方式
    最简启动、动态参数启动、配置文件启动

  2. 安装redis

  1. 新建配置文件
    将配置文件中#开头的和空行都过滤掉然后重定向到redis-6382.conf这个配置文件中
    cat redis-6381.conf | grep -v "#" | grep -v "^$" > redis-6382.conf
  • redis的最最基础配置
daemonize yes
port 6382
dir "/opt/soft/redis/data"
logfile "redis-6382.log"
requirepass 123456  # 密码
  • 后台启动redis
    redis-server config/redis-6382.conf

02-API理解和使用

  1. 通用命令
    keys、dbsize、exists、del、ttl、expire、type

  2. keys命令

  3. keys * 怎么用?
    热备从节点、scan

  4. dbsize时间复杂度是O(1), exists时间复杂度是O(1),

  5. key过期相关的命令expire,ttl, persist

  • persist命令可以取消key的过期时间,一直不过期
命令 时间复杂度
keys * O(n)
dbsize O(1)
type key O(1)
exists key O(1)
expire key EX/PX O(1)
ttl key O(1)
persist key O(1)
del key O(1)
  1. 数据结构和内部编码

  2. 单线程

    单线程为什么这么快
    (1)纯内存
    (2)非阻塞IO,使用了epoll,采用了Io多路复用技术
    (3)避免线程切换和竟态消耗

  3. flushall和flushdb
    flushall删除所有的数据库
    flushdb删除现有的数据库

  4. 字符串

  • 字符串的使用场景:缓存、计数器、分布式锁等等
    字符串命令:set、get、incr、decr、incrby、decrby
    incr key:key +1
    decr key: key -1
    incrby key number: key + number
    decrby key number: key - number

  • 计数器:记录网站每个用户个人主页的访问量
    incr userid:pageview (单线程,无竞争)

  • 缓存:缓存视频的基本信息(数据源在mysql中),伪代码

  • 分布式锁id

  • 字符串另外的一些命令
    set key value: 不管key是否存在,都设置
    setex key seconds value: 设置key/value,同时设置过期时间,单位秒
    setnx key value:如果key不存在就设置成功,如果key已经存在那么设置失败,返回0
    set gender true xx:key存在才会更新,不存在不能更新

  • mget、mset
    mget性能要比多次get好的多,如下图

  • 查漏补缺
    getset、append、strlen
    getset是一个原子的操作,为这个key设置新的值,同时返回老的值: GETSET name wangwu
    append可以给字符串末尾追加字符:append hello " abc"
    strlen可以统计字符的长度

  • incrbyfloat、getrange、setrange
    incrbyfloat f1 3.5: 浮点数增加
    getrange key start end:按索引截取字符串
    setrange key offset value: 按索引修改字符串

  • 字符串总结:

    字符串常用16个命令:set get mset mget incr decr incrby decrby incrbyfloat setnx setxx setex getset strlen getrange setrange append

  1. hash
  • hget hset hdel
  • hexists hlen
  • hmget hmset
  1. hash实战
  • hincrby key field increment
  • 当做缓存
  1. hash其余命令
  • hgetall hkeys hvals
    字符串和hash命令对比

  1. hash命令查漏补缺
  • hsetnx hincrby hincrbyfloat
  1. hash时间复杂度总结

  2. list

  • rpush lpush lpop rpop
  • lindex key index
  • lrange key start end
  • lrem key count value
  • linsert l1 BEFORE|AFTER pivot value
  1. lrem命令
    lrem key count value
    count分为三种情况:
    (1)count>0: 从左边删除count个value
    (2)count<0: 从右边删除Math.abs(count)个value
    (3)count=0: 删除所有的value

  2. ltrim命令,按照索引范围修剪列表
    ltrim key start stop
    将一个列表裁剪成左闭右闭的列表

  3. lset命令,更新指定索引的值
    lset key index value

  4. list查漏补缺

  • blpop/brpop key [key ...] timeout
    lpop的阻塞版本,timeout是超时时间,timeout为0表示一直阻塞知道收到消息弹出
  1. TIPS
    lpush + lpop = stack
    lpush + rpop = queue
    lpush + brpop = message queue

  2. set集合

  • sadd srem
  • SINTER key [key ...] 可以获取两集合中的交集
  • SDIFF key [key ...] 可以获取第一个key有的而第二个key没有的
  • SUNION key [key ...] 获取两个集合中所有的元素(相同的自动就去重了)
  • 集合的特点: 无序、不重复、集合间操作sinter sdiff sunion
  • smembers key: 获取集合中的所有元素
  • sismember key member:查看一个元素是否是集合中的元素
  • scard key: 获取集合中一共有多少个元素
  • srandmember key [count]:从集合中随机获取count个元素
  • spop key [count]: 从集合中随机弹出count个元素
  1. zset有序集合
  • 集合VS有序结合

  • 列表VS有序结合

  • 重要API(注意:score可以重复,element不可以重复)
    添加:zadd key score element
    删除:zrem key member [member ...]
    按照分值范围进行删除:zremrangebyscore key min max
    按照片名范围进行删除:zremrangebyrank key start stop
    查看:zrange key start end
    根据成员获取分值:ZSCORE key member
    给成员增加指定的分值:zincrby key increment member
    获取集合中元素的个数:zcard key
    按照分值范围获取元素个数:zcount key min max
    获取成员在有序集合中的索引排名:zrank key member(按照升序的排名)
    获取成员在有序集合中的索引排名:zrevrank key member (按照降序的排名)
    获取有序结合中从start开始到end结束的集合元素和score分值:zrange key start stop [WITHSCORES]

  • 查漏补缺
    有序集合中按照降序获取元素:zrevrange key start stop [WITHSCORES]
    按照成绩从小到大获取:zrangebyscore key min max [withscores]
    按照成绩范围从大到小获取zrevrangebyscore key max min [WITHSCORES]
    大于等于两个有序集合的交集放到新的集合中,并且score+在一起:zinterstore destination numkeys key [key..]
    将多个集合并集到新的集合中,并且score+在一起:zunionstore destination numkeys key [key ..]

  • 有序集合命令总结

posted @ 2022-04-10 12:51  专职  阅读(164)  评论(0编辑  收藏  举报