详细的Redis基础入门教程

目录

      • 什么是NoSQL
      • CAP理论
        • 传统的ACID
      • CAP概念
      • 什么是Redis
      • 基本操作
        • 启动
        • 启动后
        • Redis数据类型
        • 功能性命令
          • Redis的键(key)
          • Redis字符串(String)
          • Redis列表(List)
          • Redis集合(Set)
          • Redis哈希(Hash)
          • Redis有序集合(Zsort)
        • 三种特殊的数据类型
          • Geospatial地理位置
          • Hyperloglog基数统计
          • BitMap位图场景

什么是NoSQL

NoSQL( Not Only SQL )不仅仅是数据库,是一种使用key-value键值对存储数据的非关系型数据库,具有很高的读写能力。原始访问数据库是直接从DAO层访问数据库的,现在在中间加个缓存数据库,这个就是相当于NoSQL。

关系型数据库与非关系型数据库的区别

关系型数据库

  • 优点:易于维护,支持复杂SQL查询
  • 缺点:海量数据读写性能比较差 ,固定的表结构,灵活度低;

非关系型数据库

  • 优点:格式灵活,速度快,高扩展性,成本低:NoSQL数据库部署简单

  • 缺点:不提供sql支持,无事务处理,数据结构相对复杂,复杂查询方面稍欠。


CAP理论

传统的ACID

  • A(Atomicity) 原子性

    事务中的操作要么全成功,要么全不成功

  • C(Consistency) 一致性

    事务执行前后,数据保持一致,多个事务对同一个数据

  • I(Isolation)独立性

    访问数据库的时候,一个事务不被其它事务干扰

  • D(Durability)持久性

    ⼀个事务被提交之后。它对数据库中数据的改变是持久的

CAP概念

  • C(Consistency)强一致性
  • A(Availability)可用性
  • P(Partition tolerance)分区容错性

CAP只能选三选二:一个分布式系统,不可能同时满足C,A,P这三个需求

只能满足两个,分布式系统必占 P

  • CA:单点集群,扩展性不大
  • CP:满足一致性,性能不太高
  • AP:可用性,分区容错性的系统 ,对一致性要求不高(大部分分布式系统采用这个)

什么是Redis

Redis的全称就是Remote Dictionary Server字面翻译就是远程字典服务,Redis是一款高性能,以键值对(key-value)的方式存储数据的数据库。Redis自身就是一个Map,所有的数据都是以key-value方式存储。

特点

① 支持数据持久化
② key-value存储数据
③支持数据备份

应用

①对热点数据加速查询:热点商品,热点新闻…
②任务队列:秒杀活动,抢购,购票排队…
③时效性信息队列:验证码
④分布式数据共享:分布式下的session
⑤消息队列
⑥分布式项


基本操作

启动

  • 查看Redis是否启动

     ps -ef|grep redis
    
  • 启动Redis

    redis-server redis.conf
    
  • 客户端连接

    redis-cli -p 6379
    

启动后

  • 单进程

    单进程处理客户端请求,读写事件的响应通过对epoll函数包装处理的,Redis实际的处理速度完全依靠的是主进程的执行效率

  • 数据库

    默认16个,数组下标从0开始

  • select

    查看当前的数据库表

  • DBSIZE

    查看当前数据库的key数量

  • Flushdb与FlushAll(上线环境禁用)

    删除当前库和删除全部库

Redis数据类型

五大数据类型: 字符串(String),列表(List),哈希(Hash),集合(Set),有序集合(Zset)

  • 字符串(String)

    一个key对应一个value,可以存任意数据。

  • 哈希(Hash)

    键值对集合,String类型的映射表,适合存储对象。

  • 列表(List)

    简单的字符串列表,按照插入顺序排序,底层是链表。

  • 集合(Set)

    string类型的无序集合,通过HashTable实现的。

  • 有序集合(Zset)

    与set不同的是每个元素关联一个doule类型的分数,set不可重复,分数可重复。

功能性命令

Redis的键(key)
  • 查看当前库下所有的key(keys *)

    keys *
    
  • 查看是否存在k1

    exists k1
    
  • 将key移到其它库下

    move key db 
    
  • 给key设置失效时间

    expire key 秒
    
  • 查看key的失效时间: -1表示永久不失效,-2表示已经失效,失效就从内存中移除

    ttl key
    
  • 查看键类型

    type key
    
Redis字符串(String)
  • set/get/del/append/strlen

    set key value 存值
    get key 取值
    del key 删值
    append key value1 追加值
    strlen key 看长度
    
  • incr/decr/incrby/decrby: 必须是数字,才能操作

    incr key 加1
    decr key 减1
    incrby key num 加num
    decrby key num 减num
    
  • getrange/setrange

    getrange key 0 3 取key中value从1到第四个元素,0 -1 显示全部
    setrange key 0 xxx 从第一个元素开始覆盖为xxx
    
  • setex/setnx

    setex k1 10 v1 k1存活10s
    setnx k2 10 v2 k2存在设置无效
    
  • mset/mget/msetnx

    mset k1 v1 k2 v2 k3 v3 批量设置
    mget k1 k2 k3 批量获取
    msetnx k3 v4 k4 v4 批量设置,区别就是一个key如果存在则就设置失败 
    
Redis列表(List)

单值多value

  • lpush/rpush/lrange

    lpush list01 0 1 2 3 4 5 设置列表 左入栈 5 4 3 2 1 0
    lrange list01 0 -1 查看列表
    rpush list02 0 1 2 3 4 5 右入栈 0 1 2 3 4 5
    
  • lpop/rpop

    lpop list01 左边出栈,每次一个 5
    rpop list02 右边出栈,每次一个 0
    
  • lindex

    lindex list01 2 根据索引查看元素
    
  • llen: 数组长度

  • lrem

    lrem list01 1 2 删除1个2
    
  • ltrim

    ltrim list01 3 5 截取第4个到第6个元素【4,6】
    
  • rpoplpush

    rpoplpush list01 list02 
    将底部的元素复制一个元素到头栈  源: 0 1 2 3 4  现 4 0 1 2 3 4
    
  • lset

    语法:lset key index value

    lset list01 1 x 将第二个元素设置为x
    
  • linsert

    语法: linsert key before/after v1 v2

    linsert list01 before/after v1 v2 在v1值前/后添加v2
    
Redis集合(Set)
  • sadd/smembers/slsmember

    sadd set01 1 1 2 3 4 4 去重 set01 1 2 3 4
    smembers set01 输出1 2 3 4
    sismember 2 是否存在此元素
    
  • scard: 获取集合元素个数

  • srem

    srem set01 2 删除元素
    
  • srandmember

    语法:srandmember key 整数n(随机抽取n个数)

    srandmember set01 3 集合set01抽取3个数
    
  • spop: 随机出栈

    spop set01 
    
  • smove: 元素移动

    smove k1 k2 3

    smove set01 set02 4 将set01中的4移动至set02中
    
  • sdiff: 差集 只在第一个里面,不在第二个里面

  • sinner: 交集

  • suniox: 并集

Redis哈希(Hash)

KV模式不变,value是一个键值对

  • hset/hget/hmset/hmget/hgetall/hdel

    hset user id 11  设置用户id
    hget user id 获取用户id
    hmset user id 11 name zs age 21 批量设置用户信息
    hmget user id name age 批量或取用户信息
    hgetall 批量或取用户信息
    hdel user name 删除用户名
    
  • hlen key: key存储的元素个数

  • hexist Obj key: 某个对象中是否存在元素key

  • hkeys/hvals

    hkeys user 获得所有key
    hvals user 获得所有value
    
  • hincrby/hincrbyfloat

    hincrby user age 2 加整数
    hincrbyfloat user salary 999.99 加小数
    
  • hsetnx

    hsetnx user email [email protected] 用户对象中没有email则设置,有则不设置
    
Redis有序集合(Zsort)
  • zadd/zrange

    必须带个分数值

    zadd set02 60 v1 70 v2 80 v3 90 v4 100 v5 
    zrange set02 0 -1 查看全部
    
  • zrangebyscore key

    zrangebyscore set02 60 90 根据分数找value
    zrangebyscore set02 (60 (90 不包含
    zrangebyscore set02 60 90 limit 2 2 相当分页
    
  • zrem

    zrem set02 v1 删除值为v1
    
  • zcard/zcount/zrank/zrerank/zrevrange

    zcard set02 获得下标的值5
    zcount set02 60 90 获得区间范围个数 4
    zrank set02 v4 获取v4的下标
    zscore set02 v4 v4所对应的分数值
    zrerank set02 v4 倒着获取下标的值
    zrevrange set02 0 -1 倒着遍历出value
    

三种特殊的数据类型

Geospatial地理位置
  • geoadd/geopos/geodist/georadius

    geoadd china:city 116.51 39.84 beijing 添加城市的地理位置
    geopos china:city beijing 获取指定城市的经纬度
    geodist china:city beijing shanghai 获得两地的距离
    georadius china:city 110 30 1000 km 以110和30为距离方圆1000km的城市 
    

​ Geospatial底层使用zset封装

Hyperloglog基数统计

基数就是一个集合中不重复元素的个数,一个人访问网站多次,但是算作是一个人

  • pfadd/pfcount/pfmerage

    pfadd mykey 1 1 2 2 3 3 4 44 44 4 5 添加基数集合
    pfcount mykey 获取基数统计个数 6
    pfmerage mykey01 mykey 取并集
    
BitMap位图场景

统计用户信息,活跃或者不活跃,打卡以及未打卡的人数,可以使用bitmaps

  • setbit/getbit/bigcount

    setbit sign 1 0 模拟打卡 星期一未打卡
    getbit sign 1 获取打卡
    bigcount sign 获取打卡的数量
    

Redis的日志级别:debug verbose notice warning

你可能感兴趣的:(Redis学习篇,redis)