Redis学习笔记(1)

我是跟着尚硅谷周阳老师的课程学习的,之前项目用过mongodb,但对redis和整个nosql都不是很熟悉,系统的学习下。
Redis和MongoDB的区别:
https://www.cnblogs.com/java-spring/p/9488227.html


1.Redis简介

  • Redis:REmote DIctionary Server(远程字典服务器)

  • 完全开源免费,用C编写,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,别称数据结构服务器

  • 特点

    • 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启时可再次加载进行使用
    • 不仅支持key-value类型的数据,也提供list、set、zset、hash等数据结构的存储
    • 支持数据备份,即master-slave模式的数据备份
  • 特别功能

    • 内存存储和持久化:支持异步将内存中的数据写到硬盘上,同时不影响继续服务
    • 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
    • 模拟类似于HttpSession这种需要设定过期时间的功能
    • 发布、订阅消息系统
    • 定时器、计数器

2.Redis安装

https://redis.io/ 国外官网

http://redis.cn/ 国内官网

  • Windows安装

  • 企业实战用Linux,那就Linux吧…

    • 虽然那次做汇编实验,用VMware跑过WIN7,再重新按centos吧,我安装的是centos7。

    • centos7联网
      在这里插入图片描述

    • 运行make 命令时出现错误解析

      安装gcc(需要联网)
      在这里插入图片描述

    • 二次make,清除一下之前生产的文件

    • 再次make,安装完成
      在这里插入图片描述

    • 运行一下make install,检查是否安装成功

    • 启动myredis
      在这里插入图片描述
      在这里插入图片描述

    • 关闭连接
      在这里插入图片描述

3.Redis 杂谈

  • redis有多个数据库,可以相互之间切换
    在这里插入图片描述
    数据库0有键值对(k1,hello),切换到数据库7则找不到k1所对应的值。

    select命令切换数据库,比如:

    select 7
    
  • Dbsize查看当前数据库的key的数量

  • 查看有几个键值对

    keys *
    
  • 清库!!

    清除所有数据库

    flushall
    

    清除当前数据库

    flushdb
    

4.Redis大纲

  • 数据类型、基本操作和配置
  • 持久化和复制、RDB/AOF
  • 事务的复制
  • 复制

5.Redis数据类型

Redis的五大数据类型

  • String(字符串)

    • 最基本的类型,一个key对应一个value

    • 二进制安全:redis的string可以包含任何数据,比如jpg图片或者序列化的对象

    • 一个redis中字符串value最多可以是512M

  • Hash(哈希)

    • 是一个键值对集合
    • 是一个string类型的field和value的映射表,hash特别适合用于存储对象
  • List(列表)

    • 按插入顺序排序,底层以链表实现
  • Set(集合)

    • 无序无重复
    • 通过HashTable实现
  • Zset(sorted set:有序集合)

    • Redis的zset和set都是string类型元素的集合,并且不允许有重复的成员
    • 二者不同在于zset每个元素都会关联一个double类型的分数
    • 有序就是按照分数的大小来为集合中的成员进行排序
    • zset中成员不可重复,但是分数(score)可以重复

6.数据类型的基本操作

  • 数据类型操作命令的文档

    http://redisdoc.com/

  • Redis键(key)

    • exists key的名字:判断某个key是否存在
    • move key db :将key-value从当前数据库移入db
    • expire key 秒钟:为给定的key设置过期时间,过期之后使用keys *命令也查不到了,过期就移除数据库。
    • ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已经过期
    • type key:查看key的类型
    • 将key存入数据库:set k1 v1
    • 获取key:get k1
  • Redis字符串(String)

    • set/get/append/strlen

    • Incr/decr/incrby/decrby

      • incr自增1,decr自减1
      • incrby:incrby k1 3,增加指定数值;decrby同理
    • getrange/setrange

      字符串切分,两端都是闭区间,例如执行以下命令

      set k1 tb123456
      getrange k1 0 3
      

      结果:tb12

      setrange就是部分赋值,一个道理

      setrange k1 1 xxx
      

      结果:txxx3456

    • setex(set with expire)键秒值/setnx(set if not exist)

      设置键值对(k2,v2),10秒后过期

      setex k2 10 v2
      

      如果k3存在,返回0;如果不存在,设置并返回1

      setnx k3 v3 
      
    • mset/mget/msetnx

      一次放多个键值对

  • Redis列表(List)

    单键多值

    • Lpush/rpush/Lrange
      在这里插入图片描述

    • Lpush就是正放反出,类似于栈

    • rpush先进先出,类似于队列

    • Lrange 后边带着3个参数,第一个是列表的key,后两个是区间,0 -1意思是列表的全部

    • lpop/rpop

      每次除去一个,对应上一对命令
      在这里插入图片描述
      有点绕.

    • Lindex

      按照索引下标获得元素(从上到下),跟数组差不多

    • Llen

      列表长度

    • Lrem key

      删除N个value,比如:

      删除list03中的3个5
      在这里插入图片描述

    • Ltrim key

      开始index,结束index,截取指定范围的值后再赋值给key,比如
      在这里插入图片描述

    • rpoplpush 源列表 目的列表
      在这里插入图片描述
      有点计组指令的感觉了…

      挺好理解,把源列表的最下面一个值插到目的列表的最上面一个位置。

    • Lset key index value

      把list01列表中第一个位置赋值为x

      lset list01 1 x
      
      
    • Linsert key before/after 值1 值2

      在list01列表中x前面插java,后面插oracle

      Linsert list01 before x java 
      Linsert list01 after x oracle
      
      

      ps:因为列表值可以重复,插入是找到第一个值为x的位置来插入

    • 性能总结

      • 字符串链表,左右都可以插入添加
      • 如果键不存在,创建新的链表
      • 如果键已存在,新增内容
      • 如果键全移除,对应的键消失
      • 因为是链表实现,头尾插入效率比较高,但是在中间插入,效率比较低了,如果遍历搜索指定值来插入的话,时间复杂度为O(N)
  • Redis集合(Set)

    • sadd/smembers/sismember
      在这里插入图片描述

    • scard:获取集合里面的元素个数

    • srem key value 删除集合中的元素

      srem set01 3
      
      
    • srandmember key 某个整数(随机出几个数)

      未测试成功,用的时候找文档吧。

    • spop key 随机出栈

    • smove key1 key2 在key1里某个值

      将key1里的某个值赋给key2

    • 数学集合类

      • 差集:sdiff
        • sdiff set01 set02
        • 作用:返回在set01不在set02 里的元素,以下同理
      • 交集:sinter
      • 并集:sunion
  • Redis哈希(Hash)

    KV模式不变,但V是一个键值对。什么意思呢?就是比如存user 吧,user作为一个键,对应也有一个V,但是这个V呢,是多个键值对,比如说user对应的value有name,有age;name又作为一个key,对应的值可以是zhangsan ,同理age对应的值是18。

    • hset/hget/hmset/hmget/hgetall/hdel
      在这里插入图片描述

      //得到多个
      hmget user name age
      //设置多个
      hmset user name zhangsan age 18
      //得到所有
      hgetall user
      //删除 user 中 name
      hdel user name 
      
      
    • hlen:个数,比如刚才没删除之前hlen user ,结果就为2

    • hexists key:是否存在

      hexists user name 		//返回1
      hexists user password 	//不存在,则返回0
      
      
    • hkeys/hvals

      • hkeys 获取 所有key的名称

      • hvals 获取 所有value的值

        hkeys user 
        kvals user 
        
        
    • hincrby/hincrbyfloat

  • Redis有序集合Zset(sorted set)

    lzset01是有序集合的key,对应多个value,每一个value前面有一个分数

    ​ |-----60-----v1

    ​ |-----70-----v2

    zset01-----|-----80-----v3

    ​ |-----90-----v4

    ​ |-----100-----v5

    • zadd/zrange
      在这里插入图片描述

    • zrangebyscore key 开始score 结束score

      zrangebysore zset01 60 90
      
      

      结果:v1 v2 v3 v4

    • zrem key 某score下对应的value值,删除元素

    • zcard/zount key score区间/zrank key values值 获得下标值/zscore key 对应值,获得分数

    • zrevrank key values值, 作用是逆序获得下标值

    • zrevrange

    • zrerangebyscore key

7.配置文件redis.conf


好多图啊,上传好麻烦。。

发布了19 篇原创文章 · 获赞 4 · 访问量 276
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览