redis数据结构介绍_Zkuzma的博客-程序员秘密

技术标签: redis  

Redis-课堂笔记

一、简介

目标

  • 了解NoSQL的概念
  • 了解Redis是什么样的数据库

讲解

1. NoSQL:Not only SQL

  • 数据库类型:
    • 关系型数据库:以表的形式存储数据,以键和约束的形式维护数据关系,这样的数据库就是关系型数据库
      • MySql,Oracle,SQLServer,DB2,Sybase等等
    • 非关系型数据库(NoSQL):不以表的形式存储数据的数据库
  • 为什么有非关系型数据库?
    • 关系型数据库:随着数据量的增加、用户的增加,出现了一些难以解决的问题:
      • 高并发问题:瞬间有海量的请求同时操作数据库。比如:双11,12306春节抢票
      • 高性能问题:瞬间从海量数据里,找到并操作某一条数据。比如:微博的数据量,亚马逊的数据
      • 高扩展性问题:数据库集群环境里,要增加数据库节点,需要做数据迁移
    • 非关系型数据库NoSQL:
      • 易扩展
      • 高性能
      • 灵活的数据模型:不以表的形式存储
      • 高可用
  • 能否抛弃关系型数据库,全部使用非关系型数据库?不能
    • 业务数据之间是有关系的,就需要维护数据之间的关系。
    • 如果直接使用非关系型数据库,不能维护数据关系,只能自己写代码维护数据关系
    • 如果使用关系型数据库,数据库就可以帮我们维护数据之间的关系。使用非关系型数据库作为补充,提升web应用的性能。Redis就是作为缓存使用的

2. Redis

  • Redis数据库:是一个C语言编写的开源的高性能的数据库,是以key-value键值对的形式存储数据,数据是保存在了内存中,所以有极高的读写性能。官方数据:读110000次/s,写81000次/秒
  • Redis的端口:6379 merz

小结

二、安装Redis

目标

  • 能够操作windows的Redis:启动服务,打开客户端连接服务,关闭服务
  • 安装Linux版的Redis
  • 能够操作Linux版的Redis:启动服务,打开客户端连接服务,关闭服务

讲解

1. Windows版的

  • 启动服务:双击redis-server.exe
  • 启动客户端:双击redis-cli.exe
    • 启动之后,会自动连接上本机的Redis数据库,可以直接通过redis命令操作

拓展:redis-cli如何连接远程的redis服务?

在cmd/powershell里,通过命令:redis-cli.exe -h ip地址 -p 端口

在这里插入图片描述

2. Linux版的

  • 启动服务:./redis-server ./redis.conf
  • 启动客户端:./redis-cli
  • 关闭服务:./redis-cli shutdown

小结

三、数据类型

目标

  • 能说出Redis的5种数据类型【面试题】

讲解

  • Redis以键值对形式存储数据。
  • Redis的key:
    • 不要太长,不要超过1024个字节;否则会消耗内存,影响性能
    • 不要太短;否则会降低可读性
  • Redis的value:常用有5种数据类型(数据结构)
    • string:字符串类型
    • hash:哈希类型
    • list:链表类型
    • set:集合类型,无序不重复的数据集合
    • zset:有序集合类型,有序不重复的数据集合

小结

四、Redis的数据操作【重点】

1. String【重点】

目标

  • 掌握String类型的常用操作

讲解

说明
  • string是redis最基本的类型,用的也是最多的,一个key对应一个value。
  • 一个键最大能存储512MB.
应用场景
  • 作为缓存:字符串最经典的使用场景,redis最为缓存层,Mysql作为储存层,绝大部分请求数据都是在redis中操作,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。
  • 计数器:比如视频播放次数,点赞次数。
常用命令

在这里插入图片描述

  • 设置字符串:set key value
  • 获取字符串:get key
  • 删除字符串:del key
  • 存储字符串,并设置有效期:setex key seconds value

2. hash

目标

  • 掌握hash类型的常用操作

讲解

说明
  • Redis中hash 是一个键值对集合,类似于Java里的HashMap。
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

在这里插入图片描述

应用场景
  • 存储对象的数据
  • 特别适合用于存储订单信息:以订单号为key,field为商品编号,value为商品数量
常用命令

在这里插入图片描述

小结

  • 向hash里设置值:hset key field value
    • 如果要设置多个:hmset key field1 value1 field2 value2 ......
  • 从hash里获取值:hget key field
    • 如果 获取多个:hmget key field1 field2 ......
  • 从hash里删除数据:hdel key field

3. list

目标

  • 掌握list的常用操作

讲解

说明
  • 链表类型(或 列表类型,list)可以存储一个有序的字符串列表(链表),常用的操作是向列表两端添加元素,或者获得列表的某一个片段。
  • 列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
应用场景
  • 消息队列
  • 排队机制
  • 变更不频繁的排行榜(用list,比zset更节省内存)
常用命令

在这里插入图片描述

  • 向列表里添加数据:
    • 从左边添加:lpush key v1 v2 v3...
    • 从右边添加:rpush key v1 v2 v3...
  • 从列表里弹出数据:(弹出后列表里就没有了)
    • 从左边弹出:lpop key
    • 从右边弹出:rpop key

4. set

目标

  • 掌握set类型的常用操作

讲解

说明
  • Redis的Set是string类型的无序不重复的集合,Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的时间复杂度都是O(1)。集合中最大的成员数为 2的32次方 -1 (4294967295, 每个集合可存储40多亿个成员)。

  • Redis还提供了多个集合之间的交集、并集、差集的运算

应用场景
  • 共同好友
  • 共同兴趣
常用命令

在这里插入图片描述
小结

  • 向集合里添加成员:sadd key member1 member2 member3...
  • 获取所有成员:smembers key
  • 随机取出一个成员:spop key

5. zset

目标

  • 掌握zset的常用操作

讲解

说明
  • Redis 有序集合也是string类型元素的不重复的集合

    • 每个元素都会关联一个double类型的分数。有序集合的成员是唯一的,但分数(score)却可以重复。
    • redis正是通过分数来为集合中的成员进行从小到大的排序。
  • 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

应用场景
  • 排行榜
常用命令

在这里插入图片描述

  • 默认排序是从小到大的升序
  • 如果要从大到小排序,使用命令:zrevrange

小结

  • 添加成员:zadd key score1 member1 score2 member2...
  • 删除成员:zrem key member
  • 按名次范围查询:zrange key start stop withscores

五、Redis的其它操作

Redis的其它命令

目标

  • 掌握redis的一些其它通用命令

分析

  • redis的通用命令
  • redis的多数据库特性

讲解

redis的通用命令
  • keys *:查询所有的key

    • keys myset?:查询所有key为myset + 一个任意字符的
  • exists key:判断是否有指定的key 若有返回1,否则返回0

  • expire key 秒数:设置这个key在redis中的存活时间(setex key seconds value

  • ttl key:展示指定key的剩余时间

    • 如果值为 -1:永不过期
    • 如果值为 -2:已过期或者不存在
  • del key:删除指定key

  • rename key 新key:重命名key

  • type key:判断一个key的类型

  • ping :测试连接是否连接

多数据库特性
  • redis默认是16个数据库, 编号是从0~15. 【默认是0号库】

  • 常用的库操作有:

    • select index:切换库

    • move key index: 把key移动到几号库(index是库的编号)

    • flushdb:清空当前数据库

    • flushall:清空当前实例下所有的数据库

小结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Zkuzma/article/details/105309277

智能推荐

Spring 5 AbstractAutowireCapableBeanFactory 源码注释_czb彬的博客-程序员秘密

/** * Abstract bean factory superclass that implements default bean creation, * with the full capabilities specified by the {@link RootBeanDefinition} class. * Implements the {@link org.springframework.beans.factory.config.AutowireCapableBeanFactory} .

[Spark学习笔记]Chap1 Spark的设计与运行原理_David Martinez的博客-程序员秘密

本文对Spark的基础概念,功能组件,以及运行运行架构进行了介绍。

聊天demo_呼哧呼哧的博客-程序员秘密

太久没更新了好懒呀,之前做了一个聊天的app,今天分享一下。聊天首先要有通讯录,然后会话列表,最后主要是聊天部分。板块太多,这里主要分享聊天内容,主要是Signalr.js来实现的,框架用了uni-app,做简易的app用uni-app真的是太香了。首先我们先把页面大概格局准备好,这里主要包括内容区域{查看更多历史消息,行为消息,自己发出的消息,对方发出的消息},抽屉栏{表情包,更多功能-拍照、相册、转账等},底部输入栏{输入框,发送键,录音},具体布局就看个人爱好了。然后是创建一个char

小费马定理_BEconfidence的博客-程序员秘密

假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p)

aes加密算法python实现_Python实现AES加密,解密的两种方法_weixin_39522312的博客-程序员秘密

第一种import base64from Crypto.Cipher import AES# 密钥(key), 密斯偏移量(iv) CBC模式加密def AES_Encrypt(key, data):vi = '0102030405060708'pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)data = pad(data...

随便推点

mybatis IDEA——注解方式将sql语句写到接口中_在idea中用注解写sql_Bruce_Json的博客-程序员秘密

MyBatis注解方式就是将SQL语句写到接口中,优点是对于需求比较简单的系统,效率很高,缺点是当SQL语句有变化时需要重新编译代码,一般情况下不建议使用注解方式。@Select注解 @Select({ "select * from sys_user where id = #{id}" }) SysUser queryByIdAnno(Lon...

第 43 题:使用 sort() 对数组 [3, 15, 8, 29, 102, 22] 进行排序,输出结果_baoleilei6的博客-程序员秘密

[102, 15, 22, 29, 3, 8]sort函数,可以接收一个函数,返回值是比较两个数的相对顺序的值默认没有函数 是按照UTF-16排序的,对于字母数字 你可以利用ASCII进行记忆 [3, 15, 8, 29, 102, 22].sort();// [102, 15, 22, 29, 3, 8]带函数的比较 [3, 15, 8, 29, ...

磁场对于电感路径检测的影响_卓晴的博客-程序员秘密

卓大大,你好,我想问您一个关于磁场干扰电感检测的问题。 我们想将我们的智能车放在变电站中通过电磁线引导来实现巡轨,从而对变电站的环境进行一些实时的监控。 但我们了解到变电站有强的电磁场,它们会影响电磁巡迹吗? 之前看您的推文了解到电感检测只会收到同频率的电磁的干扰,不知道在强磁场内会不会受影响。或者我可以找哪些相关的资料去查阅吗?▲ 带有谐振电容的电感横扫过电磁线▲ 电磁线周围的磁场强度▲ 不增加谐振电容式电感两端的信号波形▲ 不加谐振电容式,传感器在经过线圈是所得到的电压变化▲ 永磁铁对于.

Vue中利用CSS实现卡片滑动翻转_Zoriah的博客-程序员秘密

.scene { width: 100%; height: 100%; border: 1px solid #CCC; perspective: 600px;}.card { position: relative; width: 100%; height: 100%; cursor: pointer; transform-style: preserve-3d; transform-origin: right center; transition: trans

fragment中startActivityForResult接收不到的几种常见原因_fragment startactivityforresult getintent取不到值_z2wenfa的博客-程序员秘密

今天在fragment中调用startActivityForResult() OnActivity()中死活接收不到 最后总结了主要是以下几个原因:1.intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 的原因2.onActivityResult() fragment中接收不到还可能是因为 没有使用fragment中的startAct

Postman中POST方式使用form-data和raw作为body发起请求理解_postman body raw_刘东灵的博客-程序员秘密

测试服务器选择的是Python的tornado作为Web服务器1. 首先是raw方式提交的POST请求:在这里请求提交以后, 可以从服务器端进行一个调试在这里可以看见, 利用raw作为body进行POST请求的时候, 请求的参数只能通过self.request.body获取到的.通过这个参数获取到的是一个字符串, 通过json.loads(self.request.b...

推荐文章

热门文章

相关标签