要讲的知识

  • nosql讲解

  • 阿里巴巴架构演进

  • nosql数据模型·

  • Nosql 四大分类.

  • CAP

  • BASE

  • Redis 入门

  • Redis安装(Window & Linux服务器)

五大基本数据类型

  • String
  • List
  • Set
  • Hash
  • Zset

三种特殊数据类型

  • geo 地图
  • hyperloglog
  • bitmap

Redis配置详解

Redis持久化

RDB
AOF

Redis事务操作

Redis实现订阅发布-

Redis主从复制

Redis哨兵模式

缓存穿透及解决方案:本来应该去 redis 拿数据,结果去了mysql

缓存击穿及解决方案:

缓存雪崩及解决方案

基础API之Jedis详解

. SpringBoot集成Redis操作

Redis的实践分析

数据库的三大范式

数据库三大范式包含:

第一范式(1NF);

第二范式(2NF);

第三范式(3NF)

其中,第一范式(1NF)的要求是属性不可分割,

第二范式(2NF)的要求是满足第一范式,且不存在部分依赖;

  • 第二范式(确保表中的每列都和主键相关)

第三范式(3NF)的要求是满足第二范式,且不存在传递依赖。

为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。

第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

Nosql概述

  • 大数据

    • Hadoop
    • MapReduce
    • Spark
    • HBASE
    • hive

90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够!那个时候,更多的去使用静态网页Html~服务器根本没有太大的压力!思考一下,这种情况下:整个网站的瓶颈是什么?
1、数据量如果太大、一个机器放不下了!
2、数据的索引( B+ Tree ) ,一个机器内存也放不下3、访问量(读写混合),一个服务器承受不了~
只要你开始出现以上的三种情况之一,那么你就必须要晋级! |

2、Memcached(缓存)+ MySQL+垂直拆分+读写分离+分库分表

  • MyCat

  • shardingjdbc是一个用来分库分表的框架

读写分离

  • 1 和 3 用来读
  • 2号用来写,2号 和 1,3 进行同步。

网站80%的情况都是在读,每次都要去查询数据库的话就十分的麻烦!所以说我们希望减轻数据的压力,我们可以使用缓存来保证效率!

发展过程∶优化数据结构和索引–>文件缓存( lO ) —> Memcached (当时最热门的技术!)

3、分库分表+水平拆分+MySQL集群

技术和业务在发展的同时,对人的要求也越来越高!本质︰数据库(读,写)

早些年MylISAM:表锁,十分影响效率!高并发下就会出现严重的锁问题
转战Innodb:行锁

慢慢的就开始使用分库分表来解决写的压力! MySQL在哪个年代推出了表分区!这个并没有多少公司使用!MySQL的集群,很好满足哪个年代的所有需求!

BSON(/ˈbiːsən/)是一种计算机数据交换格式,主要被用作MongoDB数据库中的数据存储和网络传输格式。它是一种二进制表示形式,能用来表示简单数据结构、关联数组(MongoDB中称为“对象”或“文档”)以及MongoDB中的各种数据类型。BSON之名缘于JSON,含义为Binary JSON(二进制JSON)。

4、如今最近的年代
2010–2020十年之间,世界已经发生了翻天覆地的变化;(定位,也是一种数据,音乐,热榜!)MySQL等关系型数据库就不够用了!数据量很多,变化很快~!
MySQL有的使用它来村粗一些比较大的文件,博客,图片!数据库表很大,效率就低了!如果有一种数据库来专门处理这种数据,MySQL压力就变得十分小(研究如何处理这些问题!)大数据的IO压力下,表几乎没法更大!

为什么要用NoSQL !
用户的个人信息,社交网络,地理位置。用户自己产生的数据,用户日志等等爆发式增长!这时候我们就需要使用NoSQL数据库的,Nosql可以很好的处理以上的情况!

什么是NosQLNosQL
NoSQL = Not Only sQL(不仅仅是SQL)关系型数据库∶表格,行,列
泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其是超大规模的高并发的社区!暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术! |

NoSQL特点
解耦!
1、方便扩展(数据之间没有关系,很好扩展! )
2、大数据量高性能(Redis一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高!)

3、数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据量十分大的表,很多人就无法设计了!)

4、传统RDBMS和NoSQL
传统的RDBMS
-结构化组织- sQL
-数据和关系都存在单独的表中-操作操作,数据定义语言-严格的一致性
-基础的事务

Nosql
-不仅仅是数据
-没有固定的查询语言
-键值对存储,列存储,文档存储,图形数据库(社交关系)-最终一致性,

  • CAP定理和BASE(异地多活)初级架构师!
  • –高性能,高可用,高可扩

大数据时代的3V:

1.海量Volume
⒉多样Variety
3.实时Velocity

互联网需求的3高:
1.高并发
2.高可拓
3.高性能

真正在公司中的实践:NoSQL + RDBMS一起使用才是最强的,阿里巴巴的架构演进!技术没有高低之分,就看你如何去使用!(提升内功,思维的提高!)

极限编程(XP) 是2000 年代初期最广为人知和使用最多的敏捷方法之一。

极限编程(ExtremeProgramming,简称XP)

极限编程(XP)是一种软件开发方法,旨在提高软件质量和对不断变化的客户需求的响应能力。

如果你未来相当一个架构师∶没有什么是加一层解决不了的!
#1、商品的基本信息
名称、价格、商家信息;
关系型数据库就可以解决了! MysQL / oracle(淘宝早年就去ToE了 ! -王坚:推荐文章:阿里云的这群疯子:40分钟重要!)淘宝内部的MysQL不是大家用的MysQL
#2、商品的描述、评论〔文字比较多)
文档型数据库中,MongoDB

#3、图片
分布式文件系统FastDFS-

  • 淘宝自己的TFS

  • Gooale的
    GFS

  • Hadoop
    HDFS

  • 阿里云的
    oss

#4、商品的关键字(搜索)
-搜索引擎so1r elasticsearch

  • Iserach:多隆(多去了解一下这些技术大佬!)
    所有牛逼的人都有一段苦逼的岁月!但是你只要像SB一样的去坚持,终将牛逼!
    #5、商品热门的波段信息
    -内存数据库
  • Redis Tair、 Memache. . .
    #6、商品的交易,外部的支付接口
    -三方应用

要知道,一个简单地网页背后的技术一定不是大家所想的那么简单!大型互联网应用问题:
·数据类型太多了!
·数据源繁多,经常重构!·数据要改造,大面积改造?

解决方案:UDSL(统一数据服务平台)

只有四个方法: insert,update,delete,insertOrUpdate,参数就是数据对象,非常简单

find
查找

orderBy
排序

limit
约束

NoSQL的四大分类

1、KV键值对:

  • ·新浪:Redis
  • ·美团: Redis + Tair
  • ·阿里、百度:Redis + memecache

2、文档型数据库( bson格式和json一样):. MongoDB(一般必须要掌握)

  • MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档!

  • MongoDB是一个介于关系型数据库和非关系型数据中中间的产品!MongoDB是非关系型数据库中功能最丰富,最像关系型数据库的!

  • ConthDB

3、列存储数据库

  • · HBase
  • 分布式文件系统

4、图关系数据库

·他不是存图形,放的是关系,比如∶朋友圈社交网络,广告推荐!.Neo4j ,InfoGrid ;

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。

键值(key-value )

  • Tokyo Cabinet/Tyrant,Redis, voldemort,Oracle BDB
  • 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。[3]
  • Key指向value的键值对,通常用hash table来实现[3]
  • 查找速度快
  • 数据无结构化,通常只被当作字符串或者二进制数据[3]

列存储数据库

  • Cassandra, HBase,Riak
  • 分布式的文件系统
  • 以列簇式存储将同一列数据存在一起
  • 查找速度快,可扩展性强,更容易进行分布式扩展
  • 功能相对局限

文档型数据库

  • CouchDB,MongoDb
  • Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)
  • Key-Value对应的键值对value为结构化数据
  • 数据结构要求不严格,表结构可变,不需要像关系型数据库一样
    要预先定义表结构
  • 查询性能不高,而且缺乏统一的查询语法。

图形(Graph)数据库

  • Neo4J,InfoGrid,lnfinite Graph
  • 社交网络,推荐系统等。专注于构建关系图谱
  • 图结构
  • 利用图结构相关算法。比如最短路径寻址,N度关系查找等
  • 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。

Redis入门概述

Redis是什么?
Redis ( Remote Dictionary Server ),即远程字典服务!

是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库
并提供多种语言的API。

结果:读的速度是110000次/s,写的速度是81000次ls .

免费和开源!是当下最热门的NoSQL技术之一!也被人们称之为结构化数据库!

Redis 能干嘛?
1、内存存储、持久化,内存中是断电即失、所以说持久化很重要( rdb、aof )

2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量! incr decre )

特性
1、多样的数据类型

2、持久化
3、集群

4、事务

Win安装

学习中需要用到的东西
1、狂神的公众号∶狂神说2、官网:https://redis.io/
3、中文网:http://www.redis.cn/

2020-04-01 最新版本为5.0.8

2023-01-20 稳定版最新为7.0.8

stable
adj.
稳定的,牢固的;稳重的,沉稳的;(化学结构或物理状态)稳定的
n.
马厩;(属同一马主或驯马师的)一群赛马;
v.
使(马)入厩,把(马)拴在马厩

Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习!

  • window 老师推荐这个 下载,下载下来 好像不对:https://github.com/dmajkic/redis/

  • 随便找一个:https://github.com/microsoftarchive/redis/releases

Redis里的文件

  • redis-benehmark.exe 测试性能的
  • redis-check-aof.exe
  • redis-cli.exe
  • redis-server.exe
ping #返回 PONG
set name kuangshen
get name

配置java环境变量

  • PATH环境变量。作用是指定命令搜索路径

  • CLASSPATH环境变量。作用是指定类搜索路径,JVM就是通过CLASSPTH来寻找类的

export JAVA_HOME=/usr/share/jdk1.6.0_14# 指定命令搜索,所以 配置 /bin。特别注意 要加上原来的 $PATH
export PATH=$JAVA_HOME/bin:$PATH# CLASSPATH 配置jar包。dt 和 tools。 特别注意要加上. 当前目录“.”不能丢
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

Linux 安装

  • 下载放入 /opt/redis-6.0.6。有个错误。不管了,用 5.0.8可以。
  • 老师的是5.0.8
$ wget http://download.redis.io/releases/redis-6.0.6.tar.gz #改为 5.0.8
$ tar xzf redis-6.0.6.tar.gz
$ cd redis-6.0.6
$ make

进入到解压后的 src 目录,通过如下命令启动Redis:

$ src/redis-server

您可以使用内置的客户端与Redis进行交互:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
  • 老师的教程
yum install gcc-c++
gcc-v
# 在redis目录执行
makemake install
# 安装到了。这是所有软件的 默认安装路径
/usr/local/bin#可以看到文件
redis-benchmark  redis-check-rdb  redis-sentinel
redis-check-aof  redis-cli        redis-server
 cd MyRedisConfig/cp /opt/redis-5.0.8/redis.conf MyRedisConfig/# 更改配置文件,在后台运行,改为 yesdaemonize yes
daemon
英
/ˈdiːmən/
n.
魔鬼,恶魔(同 demon);守护进程;后台程序;虚拟光驱软件demon
n.
魔鬼,恶魔;技艺出众的人,高手; 精力充沛的人,热情饱满的人;心魔,邪恶的事物;恶人;坏蛋,淘气鬼
  • 启动
 redis-server MyRedisConfig/redis.conf117308:C 19 Jan 2023 07:01:22.311 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
117308:C 19 Jan 2023 07:01:22.311 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=117308, just started
117308:C 19 Jan 2023 07:01:22.311 # Configuration loadedredis-cli -h 127.0.0.1 -p 6379keys *
1) "name"
shutdown #关闭redis服务端
exitps -ef | grep redis #服务端没了

安装高版本

安装6.0以上版本需要升级gcc到5.3及以上,如下:升级到gcc 9.3:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 9.3的话:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
这样退出shell重新打开就是新版的gcc了

性能测试

redis-benchmark

redis-benchmark是一个压力测试工具!官方自带的性能测试工具!

benchmark
英
/ˈbentʃmɑːk/
n.
基准;(监测计算机性能的)基准(问题)标准检查程序;(测量高度的)水准点,基准点
v.
(根据某种标准)评估,衡量;基准问题检测结果为
redis-benchmark -h localhost -p 6379 -c 100 -n 100000对我们的10万求进行写入测试
100个客户端
每次写入3个字节
只有一台服务器来处理这些请求,单机性能====== PING_INLINE ======100000 requests completed in 1.01 seconds100 parallel clients3 bytes payloadkeep alive: 196.18% <= 1 milliseconds #1毫秒,处理了 96%
99.67% <= 2 milliseconds
99.94% <= 3 milliseconds
99.97% <= 5 milliseconds
100.00% <= 5 milliseconds # <= 5毫秒,处理完了。
98911.96 requests per second # 每秒处理 9万8个请求。

基础知识

默认有16个数据库,使用的是 第0个。

  • 在配置文件,可以看到。

databases 16

dbsize #5个大小。其中一个为 qinjiang,其他四个是 我们在压力测试,没完成就结束了。
(integer) 5keys *
1) "myset:__rand_int__" 报错。不能用get取。计数器。
2) "counter:__rand_int__" 值为10000
3) "key:__rand_int__" 值为xxx
4) "mylist" 报错get name
"zhangsan"select 3 #选择3数据库。flushdb
flushall #清空所有库,压力测试放的数据,也会清空。

Redis是单线程的!

明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!|

Redis是C语言写的,官方提供的数据为100000+的QPS,完全不比同样是使用key-vale的Memecache差!

Redis为什么单线程还这么快?
1、误区1︰高性能的服务器一定是多线程的?
2、误区2∶多线程(CPU上下文会切换!)一定比单线程效率高!先去CPU>内存>硬盘的速度要有所了解!
核心: redis,是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换︰耗时的操作!! ! ),对于内存系统来说,如果没有上下文切换效率就是最高的!

多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!

  • CPU 上下文切换,在1500-2000 纳秒之间

五大数据类型

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

  • 字符串
  • 散列
  • 列表
  • 集合
  • 有序集合

范围查询:

  • bitmaps
  • hyperloglogs
  • 地理空间 geospatial

内置

  • 复制
  • LUA脚本
  • LRU驱动事件
  • 事务

不同级别的

  • 磁盘持久化
  • Redis哨兵
  • 自动分区

exists move expire type

Redis-Key

  • name 是否存在
exists name
(integer) 1move name 1 #移动到 第2个数据库。第一个数据库为0
#目标库 已经存在,移动失败。
move name 0
(integer) 0# name 10秒后 过期
expire name 10
# 查看name的过期时间。ttl time to live
ttl name
(integer) -2 #-2 就是没了。type name
string
单词
exists
英
/ɪɡˈzɪsts/
n.
存在量词(exist 的复数)
v.
存在;出现;活着(exist 的三单形式)expire
英
/ɪkˈspaɪə(r)/
v.
到期,失效;死亡;呼气,吐气;(任期)届满
move官方
move 将当前数据库的 key 移动到给定的数据库 db 当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。返回值
integer-reply:移动成功返回 1
失败则返回 0

1、String

append incr decr

append ke1 hello
(integer) 7
127.0.0.1:6379> get ke1
"v1hello"strlen ke1
(integer) 7# 追加没有的值,就是 set
append name zhangsan
(integer) 8#####################################
set views 0
OKtype views
stringincr views #加1,变成1
(integer) 1 #结果type views
stringdecr views #减1,变成了0
(integer) 0decr views #如原来是5
(integer) 4 #减1后结果为4incrby views 10 #一下增加10个
(integer) 15decrby views 4 #减去4个
(integer) 11
increase
英
/ɪnˈkriːs
v.
增长,增强,增大
n.
增长;增长量increment
英
/ˈɪŋkrəmənt/
n.
<正式>(尤指连续、定量的)增长;<正式>工资定量增长,定量加薪;(变量、函数的)正(或负)增量
v.
(计算机)使(数字值)各自增加decrease
英
/dɪˈkriːs/
v.
(使)减少,(使)降低
n.
减少,降低decrement
n.
渐减;减缩;衰减率create
v.
创造,创建;设计,创作;造成,引起;授予,册封;<英,非正式>大惊小怪,抱怨

get和set range

set key1 hello,word
OK
getrange key1 0 3 #0 - 3 获取4个字符。 [0,3]
"hell"getrange key1 0 -1 # -1就取不了,就是查看所有的,相当于get
"hello,word"set key2 abcdefg
OKsetrange key2 1 xx #从偏移量1(第一个为0),进行替换。
(integer) 7get key2
"axxdefg"

setex 和 setnx

#setex (set with expire) #设置过期时间。expire name 10,这是以后设置。
setex key3 30 hello
OKttl key3
(integer) 25#setnx (set if not exist) #不存在在设置
setnx mykey "redis" #设置成功
(integer) 1setnx mykey jedis #设置失败
(integer) 0

mset(nx) getset 冒号拼接key

mset key1 v1 key2 v2 #一下设置两个值
OKmget key1 key2
1) "v1"
2) "v2"msetnx key2 v22 key3 v3 #创建失败。key2已经存在了,只要有一个存在,都失败。
(integer) 0mset user:1:name zhangsan user:1:age 2 #巧妙的利用key
OK
mget user:1:name user:1:age
1) "zhangsan"
2) "2"set article:10000:views 1 #设置 1万ID的 文章,浏览量为 1set student:1 {name:lisi,age:4} #手写json
OK
get student:1
"{name:lisi,age:4}"type student:1
stringgetset db redis #get set
(nil)
get db
"redis"getset db mongodb #得到原来的值 redis,设置为新的
"redis"
  • jedis

数据结构是相同的!
String类似的使用场景: value除了是我们的字符串还可以是我们的数字!·计数器
·统计多单位的数量

  • uid:95256449:follow 0

    • 用户的ID,关注度 为0,一直累加

2、List

基本的数据类型,列表

在redis里面,我们可以把list玩成,栈、队列、阻塞队列!

都是 l 开头的

l和rpush lrange

lpush list1 one #将一个值或者多个值,插入到列表头部(左)
(integer) 1lpush list1 two
(integer) 2lrange list1 0 -1
1) "two"
2) "one"lrange list1 0 0 #获取 最后一个lpush插入的值,就是最左边的值。索引为0
1) "two"two one #从左边插入。rpush list1 hou #从右边插入。尾部。
(integer) 3two one hou #插入到最 右边。lrange list1 0 0 #最左边 第一个,依然是 tow
two

l和rpop

lrange list1 0 -1
1) "two"
2) "one"
3) "hou"lpop list1 #弹出左边第一个
"two"rpop list1 #弹出右边第一个
"hou"

lindex llen lrem

lindex list1 0 #获取 下标为0的值
"one"
# 如果 下标为0的 有值,就取值。 没有值 就进入阻塞。llen list1 #长度为1
(integer) 1
lrem list1 1 one #移除one,从上到下(从左往右),移除一个。
(integer) 1
lpush list one two three four two
(integer) 5lrange list 0 -1
1) "two"
2) "four"
3) "three"
4) "two"
5) "one"
lrem list 1 two #就是移除最近一个才添加的
(integer) 1lrange list 0 -1
1) "four"
2) "three"
3) "two"
4) "one"

ltrim rpoplpush

ltrim list 1 2 #只要索引 1 到 2
OK
#通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素!lrange list 0 -1 #还剩 two three
1) "three"
2) "two"
rpoplpush #移除列表的最后一个元素,放入另一个listrpoplpush list list2 #右边第一个移出。放入了list2中(没有list2就新建)
"two"lrange list 0 -1
1) "three"
lrange list2 0 -1
1) "two"

exists 和 lset

exists list
(integer) 1#将列表中指定下标的值替换为另外一个值,更新操作
lset list 0 two #往0位置添加值。并且覆盖0位置。
OK
lrange list 0 -1
1) "two"lset list 1 three #现在list长度为1。不能往1索引添加值。如果 list不存在,更不能添加。
(error) ERR index out of range

linsert

rpush mylist hello word
(integer) 2lrange mylist 0 -1
1) "hello"
2) "word"#将某个具体的value插入到列把你中某个元素的前面或者后面!
linsert mylist before word other #在word之前插入。就是word上面。
(integer) 3lrange mylist 0 -1
1) "hello"
2) "other"
3) "word"linsert mylist after word one #word已经是最后一个了。在 最后一个插入。
(integer) 0lrange mylist 0 -1
1) "hello"
2) "other"
3) "word"
4) "one"rpop mylist #从右边,把刚刚插入的值,弹出。
"one"lrange mylist 0 -1
1) "hello"
2) "other"
3) "word"lindex mylist 0 #获取第一个值,为 hello
"hello"

小结
·他实际上是一个链表,before Node after , left , right都可以插入值·如果key不存在,创建新的链表
·如果key存在,新增内容
I
·如果移除了所有值,空链表,也代表不存在!
·在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点~

消息排队!消息队列( Lpush Rpop ) ,栈( Lpush Lpop )

3、Set

set中的值是不能重读的!

sadd smembers scard srem

sadd myset hello world #添加
(integer) 2smembers myset #查看
1) "world"
2) "hello"sismember myset hello #是否存在
(integer) 1scard myset
(integer) 2smembers myset
1) "world"
2) "hello"srem myset hello #移除了 hello
(integer) 1
scard myset #还剩一个元素了
(integer) 1
card
英
/kɑːdn.
银行卡,身份证;明信片,贺卡;名片;纸牌;纸牌游戏(cards);
v.
要求出示身份证;亮牌;(高尔夫比赛中)得分;在卡片上记录;梳理

srandmember spop smove

srandmember myset #随机获取一个元素。
"world"
srandmember myset 2 #随机获取2个元素smembers myset
1) "world"
2) "hello"#srandmember 不会删除
spop myset #随机弹出一个。从存储在key的集合中移除并返回一个或多个随机元素。
"world"smembers myset
1) "abc"
smove myset myset2 abc #myset中的 abc,移动到 myset2
(integer) 1smembers myset2
1) "abc"
smove myset myset2 hahaha #找不到 要移动的值,就返回0
(integer) 0

sdiff sinter sunion

sadd key1 a b c
(integer) 3sadd key2 c d esdiff key1 key2 #差集,不同的
1) "a"
2) "b"sinter key1 key2 #交集,相同的
1) "c"sunion key1 key2 #并集。
1) "c"
2) "b"
3) "a"
4) "d"
5) "e"

微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!共同关注,共同爱好,

二度好友(六度分割理论)

4、Hash

Map集合,key-

这个值是一个map集合!

hset,hmset h和get hgetall

hset myhash field1 kuangshen #设置一个值
(integer) 1hget myhash field1 #得到一个值
"kuangshen"hmset myhash field1 hello field2 world #设置多个值。已经存在的值会覆盖。
OKhmget myhash field1 field2 #得到多个值
1) "hello"
2) "world"hgetall myhash #获取所有的键值对
1) "field1"
2) "hello"
3) "field2"
4) "world"

hdel hlen hexists hkeys和hvals

hdel myhash field1 #删除hash指定key字段!对应的value值也就消失了!|
(integer) 1hlen myhash #获取hash表的字段数量!
(integer) 1hexists myhash field2 #获取 字段的值,是否存在
(integer) 1hkeys myhash  #获取所有的键
1) "field2"
hvals myhash #获取所有的值
1) "world"

hincrby hsetnx

hset myhash field3 5
(integer) 1hincrby myhash field3 1 #加 -1 相当于 -1 了。没有:hdecrby。
(integer) 6hsetnx myhash field3 1 #已经存在的值,创建不成功
(integer) 0

hash变更的数据user name age

hset user:1 name qinjiang
(integer) 1hget user:1 name
"qinjiang"

5、 Zset

SortedSet(有序集合类型,简称zset)

zadd z(rev)range z(rev)rangebyscore

zadd myset 1 one 2 two 3 three #添加。相当于有个 权重
(integer) 3zrange myset 0 -1 #默认取出是 正序
1) "one"
2) "two"
3) "three"zadd salary 2500 xiaohong 500 kuangshen
(integer) 2zrangebyscore salary -inf +inf #排序取出,和默认的顺序一样。-无穷,到 +无穷
1) "kuangshen"
2) "xiaohong"
zrangebyscore salary -inf +inf withscores #带上 分数
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"zrangebyscore salary -inf 2400 withscores # <=2400 的。
1) "kuangshen"
2) "500"#返回指定成员区间内的成员,按成员字典倒序排序, 分数必须相同。
zrevrange salary 0 -1 # 结束填5000,也可以。翻转查询。
1) "xiaohong" #小红的是2500,排在第一个
2) "kuangshen"#这才是 有高到底的排序。返回有序集合中指定分数区间内的成员,分数由高到低排序。
zadd myset 1 hello 2 world 3 kuangshen
(integer) 3
zrevrangebyscore myset 5 0
1) "kuangshen"
2) "world"
3) "hello"
reverse
英
/rɪˈvɜːs/
v.
逆转,彻底改变(决定、政策、趋势等);撤销,推翻(法庭判决);颠倒,反转;交换,互换(位置、功能)
n.
相对,相反(the reverse);逆向,逆转;倒车挡;
adj.
相反的,反向的;背面的,反面的;(半导体结的外加电压)反向的;(地层)逆断的,冲断的;反身的

zrem zcard zcount

zrem salary xiaohong #移除有序集合中的指定元素
(integer) 1zcard salary
(integer) 2zadd myset 1 hello 2 world 3 kuangshen
(integer) 3
127.0.0.1:6379> zcount myset 1 2 #获取1-2 之间。只有2个值。#获取指定区间的成员数量!
(integer) 2

其与的一些APl,通过我们的学习吗,你们剩下的如果工作中有需要,这个时候你可以去查查看官方文档!案例思路: set 排序存储班级成绩表,工资表排序!
普通消息,1,重要消息2,带权重进行判断!

排行榜应用实现,取Top N测试!

三种特殊数据类型

geospatial 地理空间

hyperloglog

bitmaps 位图的

【狂神说Java】Redis最新超详细版教程通俗易懂1 2020-04-01:NoSQL分类,Redis Windows和Linux安装,性能测试,String,List,Set,Hash,Zset相关推荐

  1. Docker02 狂神Docker视频学习笔记 :【狂神说Java 哔哩哔哩】Docker最新超详细版教程通俗易懂

    目录 0. 视频源 0. 学习网址 基础篇 1. Docker概述 1.1 Docker为什么出现? 1.2 Docker历史 1.3 Docker能干什么 2. Docker安装 2.1 Docke ...

  2. 【狂神说Java】Docker最新超详细版教程通俗易懂 - 学习笔记

    传送门:官方参考文档 | Docker Hub镜像仓库 | [狂神说Java]Docker视频教程 Docker概述 Docker 是一个便携的应用容器,基于 Go 语言开发的.它可以让开发者打包应用 ...

  3. 【狂神说Java】Docker最新超详细版教程通俗易懂

    Docker 入门 笔记整理来源 B站UP主狂神说Javahttps://space.bilibili.com/95256449/ Docker概述 Docker为什么出现? 一款产品: 开发–上线 ...

  4. Docker超详细版教程通俗易懂 -之- 入门篇

    前言 学习Docker,你可以熟练的操作命令,能够把你的项目构建成Docker镜像! 是后端开发人员必备的技能!下面是自己的学习笔记,希望能帮助到需要的你! 特别感谢哔哩哔哩狂神:[狂神说Java]D ...

  5. Docker超详细版教程通俗易懂 -之- 进阶篇

    此刻的你,已成功入门Docker.让我们一起继续深造(内容不难,很有意思) 容器数据卷 什么是容器数据卷 docker的理念回顾:将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删 ...

  6. Redis 超详细版教程笔记

    视频教程:[狂神说Java]Redis最新超详细版教程通俗易懂 视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 目录索引 nosql 阿里巴巴架构演进 ...

  7. Docker超详细基础教程

    一.Docker介绍 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中, ...

  8. Redis第二集:Linux下安装Redis和测试,包含命令代码和问题处理办法,超详细版

    Redis第二集:Linux下安装Redis和测试,包含命令代码和问题处理办法,超详细版 一.资源 Linux下的Redis的下载地址 二.安装与测试 上传至自己的Linux平台 解压安装包 tar ...

  9. Hadoop——MapReduce相关eclipse配置及Api调用(图文超详细版)(内含遇到错误的解决方法)

    一.前情提要 前面两篇文章我们已经成功搭建了Hadoop以及安装了Hive,Sqoop和Mysql数据库,现在我们就来利用Hadoop尝试做一个小实战,实现单词统计! 还没有搭建Hadoop成功的同学 ...

最新文章

  1. ssl *** 思科支持设备型号
  2. 2021年河北高考成绩位次怎么查询,2021年河北高考一分一段表查询排名方法 成绩排名位次什么时候公布...
  3. element input 只能输入数字_Python之input()函数
  4. Verilg 2001相对于Verilog 1995的改进(Z) (内含 乘方 运算符** )
  5. C#8.0可空引用类型的使用注意要点 1
  6. 《CLR via C#》 第三版的主要内容
  7. Ruby学习-第二章
  8. apache 支持 php5
  9. 设置为自动获得IP地址,如何查看当前的IP地址
  10. 中国要做物联网技术的强国,而非大国
  11. fastboot下载大镜像报错 remote: data too large
  12. IT工程师学习方法和发展路线
  13. 控制默认使用360浏览器极速模式
  14. firefox 各个版本都在这里
  15. 02计算机优秀毕业论文-摘要·前言
  16. linux环境下如何重装系统,linux如何重装系统
  17. Linux命令: 在线练习网址
  18. matlab图像处理英文文献,数字图像处理英文文献翻译参考.doc
  19. 工作流之待办事宜消息提醒篇
  20. Sublime text3143中文乱码只能输入繁体字

热门文章

  1. 摘自【北京迅为】itop-3568开发板快速启动手册 第二章 Windows安装串口终端
  2. linux shred 目录,Linux之shred命令彻底粉碎删除文件
  3. 尝试N种低格工具失败,采用MP Tool量产工具完成U盘修复
  4. 介绍PWM、PPM、S-BUS这三者的区别
  5. 【牛客网笔试整理】美团点评 笔试整理
  6. GoldenDict使用说明
  7. STM32F4-Discovery
  8. make menuconfig 添加新选项
  9. ros3.30版本以上的动态域名解析3322与changeip成功
  10. emacs 五笔输入法