美文网首页
redis入门(整理)

redis入门(整理)

作者: 薛之谦chj | 来源:发表于2020-04-22 23:56 被阅读0次

    Redis简介

    哪些公司在使用Redis?

    github  twitter  stackoverflow   albaba baidu  weibo  等等公司

    redis的特性

    1.速度快

    2.持久化

    3.多种数据结构

    4.多种编辑语言

    5.功能丰富

    6.简单

    7.主从复制

    8.高可用,分布式

    特性1 -速度快

    数据存在内存,用c语言写的 5000行代码写的,单线程,

    速度快慢 register>L1cache>L2cache>main menory>local Disk>Remote Disk

    特性2 - 持久化(断电不丢数据)

    redis将数据保存在内存种,对数据的更新将异步的保存在磁盘上

    特性3 -数据结构

    1.string/bitmaps/Blobs  2.hash tables 3.linkedLists  4. set   5.sroted Sets

    还有新的数据结构:

    bitMaps : 位图  本质  String

    HyperLogLog: 嘲笑内存唯一值 计数  本质  String

    GEO :地理信息定位  本质 

    特性4 -支持多种客户端语言

    java  php ruby  lua  python node.js 等等

    特性5 -功能丰富

    发布订阅  lua脚本  事务功能  pipeline 等等

    特性6 -“简单”

    23000行 c语言组成    不依赖外部库    单线程模型

    特性7 -主从复制

    特性8 -高可用,分布式

    高可用 >> redis-Sentinel(v2.8)支持高可用

    分布式 >> redis-Cluster(V3.0)支持分布式

    Redis 典型应用场景

    缓存系统 计数器 消息队列  排行榜   社交网络   实时系统 

    redis 三种启动方法

    最简启动  配置文件启动  动态参数启动

    redis 常用配置 

    daemonize   是否是守护进程  no|yes

    port               redis 对外端口号  默认端口:6379

    logfile            redis系统日志

    dir                   redis 工作目录

    等等很多配置。。。。

    redis 通用命令

    1.通用命令   2.数据结构和内部编码  3. 单线程架构

    1.通用命令                                                                                                       

    keys 命令 一般不再生产环境使用                                                         

    keys :遍历所有的key    例如:keys  he* 

    dbsize : 计算key的总数

    exists key:检查key是否存在   存在返回1  不存在返回0

    del key:删除指定的key-value     重复删除返回1 不存在返回0

    expire key seconds: key在seconds秒后过期

    ttl key: 查看key剩余的过期时间

    persist key:  去掉key的过期时间

    type: 返回key的类型

    时间复杂度

    keys          o(n)

    dbsize       o(1)

    del             o(1)

    exists         o(1)

    expire         o(1)

    type           o(1)

    单线程

    单线程为什么这么快?

    1.纯内存 内存响应速度快  2. 非阻塞IO  3.避免线程切换和竞态消耗

    单线程需要注意什么?

    1.一次只运行一条命令  2. 拒绝长(慢)命令 3.其实不是单线程


    Redis API的使用和理解

    redis的数据结构

    字符串

    字符串类型应用场景: 缓存 计数器 分布式锁 等等。

    (get set del) key 命令  incr , decr, incrby,decrby

    incr key: key自增1 如果key不存在 自增后 get(key)=1

    decr key: key自减1 如果key不存在 自减后 get(key)=-1

    incrby key k: key 自增k,如果不存在,自增后get(key)=k

    decrby ket k:key自减k 如果key不存在 自减后 get(key)=-k

    实现如下功能:

    记录网站每个用户个人主页的访问量?

    incr userid:pageview(单线程:无竞争)

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

    public VideoInfo get(long id){

    String redisKey = redisPrefix +id;

    VideoInfo videoInfo = redis.get(redisKey);

    if(videoInfo == null){

    videoInfo = mysql.get(id);

    if(videoInfo!==null){

    //序列化

    redis.set(redisKey.serialize(VideoInfo));

    }

    return videoInfo;

    }

    set setnx setxx 命令

    set key value: 不管key是否存在,都设置  o(1)

    setnx key value:  key不存在,才设置           o(1)

    setxx key value: key存在,才设置                o(1)

    mget mset 命令

    mget key1 key2 key3 :批量获取key,原子操作   o(n)

    mset key1 key2 key3: 批量设置 key-value           o(n)

    getset append strlen  命令

    getset key newvalue : set key newvalue 并返回旧的value    o(1)

    append key value: 将value追加到 旧的value上                   o(1)

    strlen key: 返回字符串的长度(注意中文)                         o(1)

    incrbyfloat getrange setrange 命令

    incrbyfloat key 3.5: 增加key对应的值 3.5                               o(1)

    getrange key start end:获取字符串指定下标所有的值         o(1)

    setrange key index value : 设置指定下标所有的值              o(1)

    哈希 hash

    哈希键值结构   Mapmap结构   field 不能相同  value 可以相同

    key                                   fileld                               value

    user:1:info                 name                                 chj               

                                             age                                   21

    hget   hset   hdel   命令

    hget key field :获取hash key对应的field的value      o(1)

    hget key field :设置hash key对应的field的value       o(1)

    hget key field :删除hash key对应的field的value       o(1)

    hexists   hlen 命令

    hexists key field: 普安段hash key是否有field           o(1)

    hlen key: 获取hash key field 的数量                      o(1)

    hmget hmset 命令

    hmget key field1 field ... field:批量获取hash key的一批field对应的值         o(n)

    hmset key  field1 field ... field : 批量设置hash key的一批field对应的值       o(n)

    列表 list   key-elements

    特点:有序 可以重复 左右两边可以插入弹出

    重要API:

    增: rpush  lpush  linsert  命令

    rpush key value1 value2 ... valueN: 从列表右端插入值(1...N)                                O(1~N)

    lpush key value1 value2 ... valueN: 从列表左端插入值(1...N)                                O(1~N)

    linsert key before|after value newvalue: 在list指定的值前 | 后 插入newvalue             O(N)

    删: lpop  rpop  lrem  ltrim 命令

    lpop key:从列表左侧弹出一个item                                                                        O(1) 

    rpop key:    从列表右侧弹出一个item                                                                      O(1)

    lrem key count value:根据count值,从列表中删除所有value相等的项                   O(N)         

    (1)count >0 从左向右 删除最多count个value相等的项

    (2)count <0 从右向左 删除最多Math.abs(count) 个value相等的项             

    (1)count =0  删除所有value相等的项

    ltrim key start end: 按照索引范围修剪列表  ltrim listkey 1 4  就是删除1 4范围外的项

    查: lrange   lindex   llen

    lrange key start end(包含end):获取列表指定索引范围所有item                            O(N) 

    lindex key index:获取列表指定索引的item                                                                    O(N) 

    llen key :获取列表长度                                                                                                  O(1)

    改: lset  

    lset key index newvalue:设置列表指定索引值为newvalue                                            O(N) 

    blpop brpop 命令

    blpop key timeout: lpop 阻塞版本,timeout 是阻塞超市时间,timeout = 0 为永远不阻塞       O(1)

    brpop key timeout: rpop 阻塞版本,timeout 是阻塞超市时间,timeout = 0 为永远不阻塞      O(1)

    TIPS

    1.  LRUSH+LPOP=Stack                           栈

    2.  LPUSH+RPOP - Queue                        队列

    3.  LPUSH+LTRIM = Capped Collection    固定数量列表

    4.  LPUSH+BRPOP=MEssage Queue       消息队列

    set 集合

    特点:无序 无重复 集合间操作

    集合内API:sadd srem  scard   sismember  srandmember smembers

    sadd key element:  向集合key添加element(如果element已经存在,添加失败)            O(1)

    srem key element : 将集合key中的element 移除掉                                                         O(1)

    scard user:1 follow = 4 :计算集合大小

    sismember user:1 follow it = 1(存在) :判断it是否在集合中

    srandmember user:1:follow count = his : 从集合中随机挑count个元素

    smembers user:1:follow = music his sports it : 获取集合所有元素

    smember :  无序  小心使用

    srandmember 和spop:spop从集合弹出  srandmember不会破坏集合数据的 而且从集合中随机返回多个元素

    set集合 实战-抽奖系统  赞  踩 等  

    集合见的API : sdiff sinter sunion

    sdiff user:1:follow user:2follow = music his 差集

    sinter user:1:follow user:2follow = it sports 交集

    sunion user:1:follow user:2follow = it music his sports news ent 并集

    sdiff | sinter | sunion + store destkey   将差集 交集 并集 结果保存在destkey中

    集合见的实战:  例如 共同关注 

    tips:

    SADD = tagging  标签相关

    SPOP/SRANDMENBER = Random item  随机数

    SADD+SINTER = Social Graph 社交相关的


    Zset 有序集合

     结构:  key         (score value)

    特点: 无重复元素  有序  element+score

    重要API: zadd  zrem zscore  zincrby zcard  zrank zrange  zrangebyscore  zcount   zremrangebyrank

    zremrangebyscore

    zadd key score element (可以是多对): 添加 score (可重复的)和element (不可重复的)                      O(logN)

    zrem key element(可以是多个) : 删除元素                                                                                                 O(1)

    zscore key element :返回元素的分数                                                                                                            O(1)

    zincrby key increScore element:增加或减少元素的分数  zincrby user:1:ranking 9 chj (chj增加9分)O(1)

    zcard key :返回元素的总个数                                                                                                                      O(1)

    zrank key element :获得排名                                                                                                                       O(1)

    zrange key start end [WITHSCORES] :返回指定索引范围内的升序元素 [ 分值 ]                            O(log(N)+m)       

    zrangebyscore key minScore maxScore [ WITHSCORES ] :返回指定分数范围内的升序元素 [分值]  O(log(N)+m) 

    zcount key minScore maxScore:返回有序集合内在指定分数范围内的个数                                      O(log(N)+m)

    zremrangebyrank key start end :删除指定排名内的升序元素                                                            O(log(N)+m)

    zremrangebyscore key minScore maxScore :删除指定分数内的升序元素                                        O(log(N)+m)

    实战--排行榜 

    查缺补漏

    zrevrank :指定元素的从高到低排名

    zrevrange : 从高到低排名 取一定范围

    zrevrangebyscore :给定一个分数 获取从高到低的结果

    zinterstore :交集

    zunionstore : 并集

    有序集合总结

    基本范围: zadd zrem zcard zincrby zscore

    范围操作: zrange zrangebyscore zcount zremrangebyrank

    集合操作: zunionstore zinterstore


    学习总结:通过慕课网学习 并总结!

    可参考这个博主,这个博主总结的很详细:https://www.jianshu.com/p/bd0c2dc95a17

    相关文章

      网友评论

          本文标题:redis入门(整理)

          本文链接:https://www.haomeiwen.com/subject/bhdwihtx.html