zoukankan      html  css  js  c++  java
  • redis 1 简单介绍和存储的数据结构

    Redis是什么?

    Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

    • 基于内存运行,性能高效
    • 支持分布式,理论上可以无限扩展
    • key-value存储系统
    • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

    相比于其他数据库类型,Redis具备的特点是:

    • C/S通讯模型
    • 单进程单线程模型
    • 丰富的数据类型
    • 操作具有原子性
    • 持久化
    • 高并发读写
    • 支持lua脚本

    Redis的应用场景有哪些?

    Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。

     

    redis 基本通信模型

     执行命令:单线程执行,所有命令进入队列,按顺序执行

     单线程快的原因:纯内存访问,单线程避免了线程上下文切换产生的消耗

    RESP协议简单(即数据格式简单)

    导致问题:如果某个命令执行慢,会造成其他命令的阻塞

    Redis的数据类型及主要特性

    Redis提供的数据类型主要分为5种自有类型和一种自定义类型,这5种自有类型包括:String类型、哈希类型、列表类型、集合类型和顺序集合类型。

    1  String类型:

    它是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。

    对每种数据类型,Redis都提供了丰富的操作命令,如:

    • get/mget   //获取或者批量获取   demo   get age,  mget age  name ;
    • set/mset   //设置值,批量设置值  demo  set age 18 , mset age 20 name '小帅哥'
    • setex/setnx/msetnx  
    • setex 解释
      设置指定 key 的值为 value,并将 key 的过期时间设为 seconds (以秒为单位)。 如果 key 已经存在, SETEX 命令将会替换旧的值。 setex testSetexKey
      60 aaa # 设置过期时间为60秒

      setnx解释
      设置指定 key 的值为 value,只有在 key 不存在时设置 key 的值。

      msetnx就是批量操作了
    • incr/decr   
    • //必须为整数自加1,非整数返回错误,无age键从0自增返回1
      如 incr age 

      //必须为整数自减,
      如 decr age
    • getset 
    • getset key value
      设置指定 key 的值为 value,并返回 key 的旧值(old value)
      返回给定 key 的旧值。 当 key 没有旧值时,即 key 不存在时,返回 nil
    • del   //删除键,demo   del  name 

    incrby age 2 //整数age+2
    decrby age 2//整数age -2
    append // 追加指令
    strlen name //长度
    getrange name 2 4 //截取字符串

    2  哈希类型:

    该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。特别适用于存储,二维表,实体对象等

    Hash的操作命令如下:

    命令 hset key field value
    设值:hset user:1 name james //成功返回1,失败返回0
    取值:hget user:1 name //返回james
    删值:hdel user:1 age //返回删除的个数
    计算个数:hset user:1 name james; hset user:1 age 23;
    hlen user:1 //返回2,user:1有两个属性值
    批量设值:hmset user:2 name james age 23 sex boy //返回OK
    批量取值:hmget user:2 name age sex //返回三行:james 23 boy
    判断field是否存在:hexists user:2 name //若存在返回1,不存在返回0
    获取所有field: hkeys user:2 // 返回name age sex三个field
    获取user:2所有value:hvals user:2 // 返回james 23 boy
    获取user:2所有field与value:hgetall user:2 //name age sex james 23 boy值
    增加1:hincrby user:2 age 1 //age+1
    hincrbyfloat user:2 age 2 //浮点型加2

    三种方案实现用户信息存储优缺点

    1,原生:set user:1:name james;
    set user:1:age 23;
    set user:1:sex boy;
    优点:简单直观,每个键对应一个值
    缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境

    2,将对象序列化存入redis
    set user:1 serialize(userInfo);
    优点:编程简单,若使用序列化合理内存使用率高
    缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis

    3,使用hash类型:
    hmset user:1 name james age 23 sex boy
    优点:简单直观,使用合理可减少内存空间消耗
    缺点:要控制ziplist与hashtable两种编码转换,且hashtable会消耗更多内存erialize(userInfo);

    推荐用hash类型

    3  列表类型:

    该类型是一个插入顺序排序的字符串元素集合, 基于双链表实现。

    添加命令:
    rpush james c b a //从右向左插入cba, 返回值3
    lrange james 0 -1 //从左到右获取列表所有元素 返回 c b a
    lpush key c b a //从左向右插入cba
    linsert james before b teacher //在b之前插入teacher, after为之后,使 用lrange james 0 -1 查看:c teacher b a

    查找命令:
    lrange key start end //索引下标特点:从左到右为0到N-1
    lindex james -1 //返回最右末尾a,-2返回b
    llen james //返回当前列表长度
    lpop james //把最左边的第一个元素c删除
    rpop james //把最右边的元素a删除

    4  集合类型:

    Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。

    exists user //检查user键值是否存在
    sadd user a b c//向user插入3个元素,返回3
    sadd user a b //若再加入相同的元素,则重复无效,返回0
    smember user //获取user的所有元素,返回结果无序
    srem user a //返回1,删除a元素
    scard user //返回2,计算元素个数

    在某些场景,如社交场景中,通过交集、并集和差集运算,通过Set类型可以非常方便地查找共同好友、共同关注和共同偏好等社交关系。

    5  有序集合类型:

    ZSet是一种有序集合类型

    指令:
    zadd key score member [score member......]
    zadd user:zan 200 james //james的点赞数1, 返回操作成功的条数1
    zadd user:zan 200 james 120 mike 100 lee// 返回3
    zadd test:1 nx 100 james //键test:1必须不存在,主用于添加
    zadd test:1 xx incr 200 james //键test:1必须存在,主用于修改,此时为300
    zadd test:1 xx ch incr -299 james //返回操作结果1,300-299=1
    zrange test:1 0 -1 withscores //查看点赞(分数)与成员名
    zcard test:1 //计算成员个数, 返回1

    排名场景:
    zadd user:3 200 james 120 mike 100 lee//先插入数据
    zrange user:3 0 -1 withscores //查看分数与成员
    zrank user:3 james //返回名次:第3名返回2,从0开始到2,共3名
    zrevrank user:3 james //返回0, 反排序,点赞数越高,排名越前

    redis的全局命令
    1,查看所有键:
    keys * set school enjoy set hello world
    2,键总数 :
    dbsize //2个键,如果存在大量键,线上禁止使用此指令
    3,检查键是否存在:
    exists key //存在返回1,不存在返回0
    4,删除键:
    del key //del hello school, 返回删除键个数,删除不存在键返回0
    5,键过期:
    expire key seconds //set name test expire name 10,表示10秒过期
    ttl key // 查看剩余的过期时间
    6,键的数据结构类型:
    type key //type hello //返回string,键不存在返回none

  • 相关阅读:
    漫游Kafka介绍章节简介
    poj 2309 BST 使用树阵lowbit
    华为-on练习--小写字符数的统计显示
    OpenMp高速分拣
    eclipse 于 Tomcat于 热部署 project
    2015第49周二
    2015第49周一
    2015第48周六
    2015第48周五
    2015第48周四
  • 原文地址:https://www.cnblogs.com/hup666/p/13430933.html
Copyright © 2011-2022 走看看