目录
前言
本文是Redis数据库的学习笔记,链接:
【尚硅谷】Redis 6 入门到精通 超详细 教程_哔哩哔哩_bilibili
一、NoSQL数据库
1.1 NoSQL介绍
(1)NoSQL(Not Only SQL),泛指非关系型数据库。NoSQL不依赖业务逻辑方式存储,因此大大的增加了数据库的扩展能力。
- 不遵循SQL标准
- 不支持ACID
- 远超于SQL的性能
(2)NoSQL适用场景:对数据高并发的场景、海量数据的读写、对数据高可扩展性的
(3)NoSQL不适用的场景:需要事务支持、基于SQL的结构化查询存储,处理复杂的关系
1.2 技术分类
Redis是一种典型的NoSQL数据库
1.3 NoSQL解决的问题
(1)解决cpu和内存压力
(2)解决IO压力
1.4 常见的NoSQL数据库
(1)Memcache
(2)Redis
(3)MongoDB
二、Redis概述
2.1 概述
- Redis是一个开源的key-value存储系统。
- 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。
- 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
- 在此基础上,Redis支持各种不同方式的排序。
- 与memcached一样,为了保证效率,数据都是缓存在内存中。
- 区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
- 并且在此基础上实现了master-slave(主从)同步。
2.2 应用场景
(1)配合关系型数据库左高速缓存
- 高频次,热门访问的数据,降低数据库IO。
- 分布式架构,做session共享
(2)多样的数据结构存储持久化数据
2.3 相关技术
Redis使用的是单线程+多路IO复用技术:
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。
**串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)**
(与Memcache三点不同: 支持多数据类型,支持持久化,单线程+多路IO复用)
三、常用五大数据类型
3.1 Redis键(key)
3.2 Redis字符串(String)
3.2.1概述
(1)String是Redis的最基本数据类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
(2)String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
(3)String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。
3.2.2常用命令
- set <key> <value>添加键值对
- get <key>查询对应键值
- append <key>< value>将给定的<value>追加到原来值的末尾
- strlen <key>获得值的长度
- setnx <key> <value> 只有在key不存在时 设置key的值
- incr <key>将key种存储的数字增1 , 只能对数字值进行操作, 若为空,新增值为1
- decr <key> 将key种存储的数字减1,只能对数字值进行操作, 若为空,新增值为-1
- incrby / decrby <key> <步长> 将key中存储的值增减自定义步长
注意事项:incr key 有原子性(与java中的事物的原子性不同,是Redis特有的):对存储在指定key的数据执行原子的加1操作,这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程):1)在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生在指令之间;2)在多线程中,不能被其他进程(线程)打断的操作就叫原子操作。Redis单命令的原子性主要得益于Redis的单线程
案例:
java中的i++不是原子操作。
i=0; 两个线程分别对i进行++100次,值在2~200之间
i++在两个线程执行100次,最终的结果是 - 百度文库 (baidu.com)
- mset <key1> <value1> <key2> <value2>……同时设置一个或多个key-value对
- mget <key1> <key2> 同时获取一个或多个value
- msetnx <key1> <value1> <key2> <value2>…同时设置一个或多个key-value对,当且仅当key都不存在时,原子性,有一个失败则都失败
- getrange <key><起始位置><结束位置> 获取值的范围,类似Java中的subString,前包后包
- setrange <