文章目录
- NoSQL数据库引入
- NoSQL数据库简介
- redis6概述和安装
- 启动方式
- 相关知识介绍
- key键操作
- string
- list
- Set
- hash
- Zset
NoSQL数据库引入
解决CPU以及内存压力
cookie是一种存储在用户计算机上的小型文本文件,用于跟踪、识别用户和提供个性化的服务。
会话(Session)和Cookie是两种不同的机制用于在Web应用中跟踪用户和存储用户状态信息。
主要区别如下:
-
存储位置:Cookie是存储在用户计算机的浏览器中,而会话数据则通常存储在服务端。Cookie通过在浏览器中存储一个唯一的标识符来识别用户,而会话数据存储在服务器上。
-
数据容量:Cookie的容量比较小,通常限于几KB左右,而会话数据可以存储更多的信息,因为它存储在服务器上。
-
生命周期:Cookie可以设置一个过期时间,使其在指定时间后失效,也可以设置为会话Cookie,关闭浏览器后会自动删除。而会话数据的生命周期通常在用户注销、超时或关闭浏览器时结束。
-
安全性:Cookie存储在用户计算机上,因此有一定的安全风险,例如可能被恶意软件获取或窃取。会话数据存储在服务器上,相对更安全,因为用户无法直接访问或修改。
-
用途:Cookie主要用于跟踪用户和存储用户的偏好设置、登录状态等信息,以提供个性化的服务。会话数据用于在用户访问网站的不同页面或进行交互时保持用户的状态和数据。
为了解决单点服务器的压力问题,有了分布式服务器。分布式服务器存在着session不共享的问题。解决方法如下:
- 存在cookie中。缺点是不安全、网络负担效率低。
- 存在文件服务器或者数据库里。缺点是大量的IO效率问题 。
- session复制。数据冗余,节点越多,数据冗余越多。
- 缓存数据库。完全在内存中,速度快,数据结构简单。
解决IO压力
NoSQL数据库简介
NoSQL(not only sql)泛指非关系型数据库,不依赖业务逻辑方式存储,而以简单的key-value模式存储,大大增加了数据库的扩展能力。
-
不遵循sql标准
-
不支持ACID
-
远超于sql的性能
使用场景 -
对数据高并发的读写
-
海量数据的读写
-
对数据的高扩展性
不适用的场景 -
需要事务支持
-
基于sql化的结构查询,处理复杂的关系
一些nosql数据库
Memcache
Redis
MongoDB
列式数据库
行式数据库
HBase是Hadoop项目中的数据库,用于需要对大量的数据进行随机、实时的读写操作场景中。
Neo4j图关系型数据库:主要应用于社会关系、公共交通网络;
redis6概述和安装
首先进入官网,下载redis-6.2.13.tar.gz
解压命令:tar -zxvf redis-6.2.13.tar.gz
解压之后进入目录,cd redis-6.2.13
在redis-6.2.13目录下执行make命令
输入make install进行安装,安装成功之后默认存放在/usr/local/bin中
- redis-benchmark性能测试工具,可以在自己的笔记本运行,看看性能如何。
- redis-check-aof修复有问题的AOF文件
- redis-check-rdb修复有问题的rdb
- redis-sentinel。redis集群使用
- redis-server.redis服务器启动命令
- redis-cli.redis客户端操作入口
启动方式
前台启动(不推荐;前台启动,命令行窗口不能关闭,否则服务器停止)
命令:redis-server
后台启动
备份redis.conf
拷贝一份redis.conf到其它目录
后台启动设置daemonize no改成yes
修改redis.conf文件里面的daemonize no 改成yes让服务器后台启动
启动服务器
redis-server /opt/redis-6.2.13/redis.conf
启动redis
redis-cli
关闭客户端shutdown(服务器也会被关闭)
相关知识介绍
- 默认16个数据库,下标从0开始,初始默认使用0号库;使用命令select 切换库
- 统一密码管理,所有库的密码一样
- dbsize查看当前数据库的key的数量,如果存在大量键,线上禁止使用此指令。
- flushdb清空当前数据库
- flushall通杀全部库
- redis是单线程+多路IO复用技术
- 与Memcache(多线程+锁)三点不同之处:支持多数据类型、支持持久化、单线程+多路IO。
key键操作
查看当前库所有key(keys *)
还能用来搜索
keys m*[以m开头的key]
查看某个key是否存在(exists key)存在返回1 ,不存在返回0
查看key的类型(type key)
删除指定key的数据
unlink key根据value选择非阻塞删除,仅将key从keyspace元数据中删除,真正的删除会在后续异步完成
expire key 10(为指定的key设置过期时间单位秒)成功返回1,失败返回0
expireat key timestamp(设置key在某个时间戳 精确到秒之后过期)
pexpire key milliseconds(为指定的key设置过期时间单位毫秒)
persist key去掉过期时间
ttl key查看还有多少秒过期-1表示永不过期、-2表示已过期
monitor(实时监听并返回redis服务器接收到的所有请求信息)
shutdowm 把数据同步保存到磁盘上并关闭redis服务
save就是在主线程进行"RDB持久化"
info 查看当前节点信息
string
- string 类型是最基本的类型,一个key对应着一个value
- string类型是二进制安全的,意味着string类型可以包含任何数据,比如jpg图片或者序列化的对象
- 字符串value的值最多可以是512M
常用命令
- set key value(设置string类型的键值对key-value,设置相同的key会覆盖原先的内容)
- get key (获取key对应的value)
- append key value(将给定的key-value加入到原值的末尾,返回新value的长度)
- strlen key(获取值的长度)
- setnx key value只有当数据库中key不存在时,可以将key-value添加数据库
- setex key time value(设置key的过期时间,秒)
- inrc key(将key中存储的数据增1,只能对数字值进行操作,若为空则新增为1)
- derc key(将value值减一)
- incrby/decrby key len (将key中存储的数值增减自定义的长度)
incr等一系列操作是原子性操作(不会被线程调度机制打断的操作),这种操作一旦开始,就一直运行到结束,中间不会切换到另一个线程。
在单线程中,能够在单条指令中完成的操作可以认为是“原子性操作”
在多线程中,不能被其它线程打断的操作叫做原子性操作
redis单命令的原子性得益于redis的单线程 - mset key1 value1 key2 value2…(批量设置)
- mget key1 key2 key3 …(批量获取)
- msetnx key value key value…(仅当所有的key不存在时,添加成功)
- getrange key start end[左闭右闭]
- setrange key start value(从start位置开始覆盖key的字符串)
- getset key value (设置新值同时获取旧值)
list
- lpush/rpush key value value value …/从左边/右边插入一个或多个值(lpush相当于头插法,rpush相当于尾插法)
- lpop/rpop key 从左边/右边弹出一个元素(值在建在植无键无,意思就是链表中无值是,链表不存在)
- lrange key start stop按照索引下标获得元素(从左到右,0 -1表示取所有的值)
- rpoplpush key1 key2从列表key1右边吐出一个值加入到列表key2的左边
- lindex key index按照索引下标获得元素(从左到右)
- llen key获得列表长度
- linsert key before/after value newvalue在value的前面/后面插入newvalue
- lrem key n value 从左边删除n个value从左到右
- lset key index value将列表key下标为index的值替换成value
底层数据结构(quicklist:由ziplist和双向指针连接而成)
Set
redis的set是string类型的无序集合,底层是一个value为null的hash表,添加查找删除的时间复杂度为O(1)
-
sadd key value1 value2将一个或多个member元素加入到集合key中,已经存在的member元素被忽略
-
smembers key取出集合的所有值
-
sismember key value 判断集合key是否含有该value值 ,有返回1无返回0
-
scard key 返回集合的元素个数
-
srem key value1 value2
-
spop key随机从该集合中吐出一个值
-
srandmember key n随即从该集合中取出n个值,不会从集合中删除
-
smove k1 k2 value把k1中一个值移动到另一个集合k2
-
sinter k1 k2返回两个集合的交集
-
sunion k1 k2返回两个集合的并集
-
sdiff k1 k2返回两个集合的差集
hash
string类型的field-value的映射表,适合用于存储对象
-
hset key field value给key集合中的field键赋值value
-
hget key field从key集合中field中取出value
-
hmset key f1 v1 f2 v2…批量设置
-
hmget key k1 k2批量获取值
-
hexists key f1查看哈希表key中f1是否存在
-
hkeys key列出哈希集合中所有的field
-
hvals key列出哈希集合中所有的value
-
hincrby key field increment给key中field的value增自定义值
- hsetnx key field value 将哈希表中的域field的值设置成value,当且仅当field不存在时
Zset
与set的相同之处在于都是没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分,评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以重复。
- zadd key score1 value1 score2 value2…将一个或多个member元素及其score加入到有序集合key中
- zrange key start stop [withscores]返回有序集合key中下标在start-stop之间的元素
- zrangebyscore key min max [withscores] 返回有序集合中所有score值位于min和max之间包括等于min或max的成员,有序集合成员按照score值递增排序
- zrevrangebyscore key max min [withscores] 返回有序集合中所有score值位于min和max之间包括等于min或max的成员,有序集合成员按照score值递减排序
- zinrcby key increment value为元素value的score加上increment
- zrem key value 删除集合中的指定元素
- zcount key min max统计集合中scores位于区间内的元素个数
- zrank key value 返回该值在集合中的排名从0开始