一、Redis和NoSQL
1. 问题
- 读写分离,主从复制:提高读写性能和读库的可扩展性,解决单点问题
- 数据库分离:解决不同业务的访问数据库压力不同的问题
- NoSQL:解决大数据问题
- 单机Mysql的架构,随着用户数的增长,并发读写数据库成为瓶颈,引入本地缓存和分布式缓存得以解决
- 单机Tomcat压力大,响应逐渐变慢,引入反向代理实现负载均衡得以解决
2. NoSQL
2.1 Nosql介绍
NoSQL(Not Only SQL**),意即“不仅仅是SQL”,泛指非关系型的数据库。随着互联网网站的兴起,传统的关系数据库在应付特别是超大规模和高并发类型纯动态网站已经显得力不从心,暴露了很多难以克服的问题
2.2 NoSQL类别
-
KV型NoSql(代表----Redis) 基于内存,读写快速
-
列式NoSql(代表----HBase)适用于大规模实时数据
-
文档型NoSql(代表----MongoDB)使用于博客类型
-
搜索型NoSql(代表----ElasticSearch)适用于海量数据搜索,电商平台
特点:
-
格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型
-
速度快,高扩展性,低成本
-
不提供sql支持,学习和使用成本较高,无事务处理,数据结构相对复杂,复杂查询方面稍欠
3. Redis
3.1 Redis介绍
Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库
3.2 Redis特性:
- 基于内存运行,性能高效
- 支持分布式
- key-value存储
- 提供多种语言的API
3.3 redis基础知识
- 默认16的库 0 - 15
- io多路复用技术
- 单线程
二、Redis下载安装
1. 拉取镜像
docker pull redis
2. 运行
docker run -itd --name myFirstRedis -p 6379:6379 redis
3. 检查
docker exec -it myFirstRedis /bin/bash
redis-server --version
4. 启动客户端
root@3f48963da1a0:/data# redis-cli
127.0.0.1:6379> exit
三、Redis的指令
1. 基本命令
# 选择库
select index
# 设置当前库下key value
set k 1
# 获取当前库k的value
get k
# 清空当前库
flushdb
# 清空所有库
flushall
2. key命令
# 查看当前库中所有的key(生产环境不可用)
keys * 获取
# 查看当前库中所有的key(生产环境可用)
redis-cli --scan "u*"
# 判断时候存在 返回个数
exists k k1
# 查看当前key 所储存的值的类型
type k
# 删除已存在的key
del k k2
# 给key设置time秒的过期时间。设置成功返回 1 当 key 不存在返回 0 单位s
expire key time
# 以秒为单位返回 key 的剩余过期时间 过期为-2
ttl k
# 移除给定 key 的过期时间,使得 key 永不过期 为-1
persist k
3. string 类型以及命令
# 给定k v
set key value
# 用于获取指定 key 的值
get k
# 将给定的value追加到key原值末尾 key 不存在 为set
127.0.0.1:6379> set k2 zh # OK
127.0.0.1:6379> get k2 # "zh"
127.0.0.1:6379> APPEND k2 ao # (integer) 4
127.0.0.1:6379> get k2 # "zhao"
# strlen 获取指定 key 所储存的字符串值的长度 不是字符串是错误
strlen key
# setex 给指定的 key 设置值及time 秒的过期时间
setex k t v
# setnx 只有在key不存在时设置key的值
# 分布式锁
setnx key value
# getrange 获取指定区间范围内的值
getrange k2 1 3
# setrange 获取指定区间范围内的值
setrange k2 5 bin
# incr 将 key 中储存的数字值增一
incr k
# 将 key 中储存的数字值增step
incrby key step
# dncr 将 key 中储存的数字值减一
dncr k
# 将 key 中储存的数字值减step
decrby key step
# 同时设置一个或多个 key-value
mset k v a b
# 返回所有(一个或多个)给定 key 的值
mget k a
# getset 获取并设置
getset k 101
-
list
# 双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差 # lpush/rpush 从左边(头部)/右边(尾部)插入一个或多个值 # lpush/rpush k1 v1 v2 v3…… LPUSH kk 1 1 2 2 3 4 5 # lrange 返回key列表中的start和end之间的元素(包含start和end) # lrange key start end 127.0.0.1:6379> LRANGE kk 0 -1 1) "5" 2) "4" 3) "3" 4) "2" 5) "2" 6) "1" 7) "1" # lpop/rpop 移除并返回第一个值或最后一个值 # lpop/rpop key 127.0.0.1:6379> LRANGE kk 0 -1 1) "4" 2) "3" 3) "2" 4) "2" 5) "1" 6) "1" # lindex 获取列表index位置的值(从左开始) # lindex key index 127.0.0.1:6379> LINDEX kk 0 "4" # llen 获取列表长度 # llen key 127.0.0.1:6379> LLEN kk (integer) 6 # lrem 从左边开始删除与value相同的count个元素。 # lrem key count value 127.0.0.1:6379> LREM kk 4 2 (integer) 2 127.0.0.1:6379> LRANGE kk 0 -1 1) "4" 2) "3" 3) "1" 4) "1" # linsert 在列表中value值的前边/后边插入一个new value值(从左开始) # linsert key before/after value newvalue 127.0.0.1:6379> LRANGE kk 0 -1 1) "4" 2) "3" 3) "1" 4) "1" 127.0.0.1:6379> LINSERT kk before 4 0 (integer) 5 127.0.0.1:6379> LRANGE kk 0 -1 1) "0" 2) "4" 3) "3" 4) "1" 5) "1" # lset 将索引为index的值设置为value # lset k index value 127.0.0.1:6379> LSET kk 0 521 OK 127.0.0.1:6379> LRANGE kk 0 -1 1) "521" 2) "4" 3) "3" 4) "1" 5) "1"