一、nosql和redis
nosql(no only sql)是非关系型数据库,或者叫不只是sql。
redis是用key-value存储的非关系型数据库,默认有16个数据库。用来作为缓存数据库,辅助业务数据库。
redis的key使用”:“,可以识别为文件夹层级
二、在Centos 7 中用Docker安装并运行Redis
(一)安装并运行
1、在docker hub 中查找redis 镜像
docker search redis
2、从docker hub 中拉取redis 镜像
docker pull redis:6.2.1
3、查看拉取的Redis镜像
docker images
4、运行 redis服务端
docker run -p 6379:6379 -d redis:6.2.1 redis-server
参数解释: docker run:启动命令 --name :给容器起名字 -p :★映射端口号,主机端口:容器端口 -v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data -i : 以交互模式运行。 -t : 进入终端。 -d : 以守护模式后台运行。 --requirepass :设置密码 -e XXX_XXX="xxxxxxxxxxx" : 指定环境变量
5、查看正在运行的容器
docker ps
6、打开redis 客户端★
docker exec -it <容器id> redis-cli
7、输入ping进行测试
打印出pong 表示运行成功。
(二)其他操作:
1、重新启动redis容器
docker restart <容器id>
2、结束正在运行的容器
docker stop <容器id> 容器优雅退出 docker kill <容器id> 容器直接退出
3、删除docker中的容器 (容器在删除前要先结束)
docker rm <容器id> [ <容器id> ...]
4、删除docker 中的镜像
docker rmi <镜像id> [ <镜像id> ...]
5、查看正在运行的redis进程
ps -ef | grep redis
6、进入容器内部
docker exec -it <容器id> bash
可以看出Redis镜像是搭建在 简化版ubantu系统之上
在系统中执行:
apt-get ls cd / uname -a 查看系统内核 cd /data 该目录是redis持久化时存储数据的位置
7、查看容器内网ip地址
docker inspect <容器id>
在这里插入代码片
8、查看docker 镜像的版本
docker image inspect <镜像名称>:latest|grep -i version
(三)redis数据库常见操作
select <number> 切换到指定数据库 keys * 查看数据库中全部的key set <key> <value> 设置键值对,若键存在,则替换值,若不存在,则新建键值对 setnx <key> <value> 设置键值对,若键存在,设置失败,若不存在,则新建键值对 get <key> 根据键取值 type <key> 查看指定键的类型 ttl <key> 查看指定键的剩余存储时间 flushdb 清空数据库 flushall 清空数据库
三、基本数据类型
String字符串、list列表、set集合、hash哈希、zset集合
(一)String字符串
set <key> <value> 设置键值对,若键存在,则替换值,若不存在,则新添键值对 setnx <key> <value> 设置键值对 get <key> 根据键取值 append <key> <add> 将内容添加到原值的末尾 strlen <key> 查看指定键的值的长度 incr <key> 对指定的键的值加1 decr <key> 对指定的键的值减1 incrby <key> <step> 对指定的键的值加上指定的步长(step) decrby <key> <step> 对指定的键的值减去指定的步长(step)
注:incr /decr/incrby/decrby 操作是原子性的他,因为redis是 单线程多io复用的。
java中的i++是多线程操作,不是原子操作。
setex <key> <seconds> <value> 添加键值对,设置指定的有效时间 mset <key> <value> [ <key> <value> ...] 设置多个键值对 mget <key> [ <key> ...] 查看多个键的值 getrange <key> <start> <end> setrange <key> <offset> <value>
(二)list列表
list集合有序、可重复。
lpush <key> <value> [ <value> ... ] 从左开始推入值 rpush <key> <value> [ <value> ... ] 从右开始推入值 lpop <key> <count> 从左消去count个元素 rpop <key> <count> 从右消去count个元素 rpoplpush <key1> <count> <key1> 将key1的右侧元素 删除,放置到key2 的左侧
---------------以上的操作中:l为左(left),r为右(right)--------------------
---------------以下的操作中:l为list--------------------
lrange <key> <start> <end> 根据范围查看列表元素 例:lrange kk1 0 -1 查看列表全部元素 lindex <key> <index> 根据索引查看列表元素 llen <key> 查看列表的长度 linsert <key> <before/after> <value> <newvalue> 在value前面或后面插入newvalue lrem <key> <count> <value> 删除指定个数的相同元素 lset <key> <index> <value> 替换列表指定位置的元素
(三)set集合
set 是无序、不可重复的集合。
sadd <key> member [member ...] 添加set集合 spop <key> [<count>] 随机排出指定个数的元素 smembers <key> 查看set集合全部元素 sismember <key> <value> 判断指定键的值中元素是否有value,有则返回1,没有则返回0 srandmember <key> <count> 查看随机count个的元素 srem <key> <value1> <value2> ... 删除指定key的set值中的某个元素 smove <source> <defin> <value> sinter <key1> <key2> 查看两个集合元素的交集 sunion <key1> <key2> 查看两个集合元素的并集 sdiff <key1> <key2> 查看两个集合元素的差集
(四)hash哈希
hset <key> <field> <value> 设置键-字段-值 hget <key> <field> 获取键-字段的值 hsetnx <key> <field> <value> 当且仅当字段不存在,设置键-字段-值;若字段存在,则设置失败 hincrby <key> <field> <step> 给指定键-字段 增加指定步长 hexists <key> <field> 判断指定键-字段的值是否存在 hmset <key> <field> <value> [ <field> <value> ...] 批量设置键-字段-值 hkeys <key> 获取hash集合所有的字段 hvals <key> 获取hash集合所有的值
(五)zset集合
zset(sortedSet)是有序、不可重复的集合. zadd <key> <score> <value> [ <score> <value> ...] 在zset集合中添加键值对 zrange <key> <start> <end> [withscores]查看集合中元素 例:zrange k1 0 -1 查看集合中全部元素 zrange k1 0 -1 withscores 查看集合中全部元素和评分(从低到高) zrangebyscores <key> <min> <max> [withscores]根据评分范围查看集合中元素 zrevrange <key> <start> <end> [withscores] 按评分从高到低查看集合中元素 zverrangebyscores <key> <min> <max> [withscores] 根据评分范围从高到低查看集合中元素 zrem <key> <value> 删除指定键值对 zrank <key> <value> 查看指定键值对的排名 zcount <key> <min> <max> 查看分数范围内的元素个数
四、发布和订阅
redis发布和订阅是一种消息通信模式,发布者(publish)发布消息,订阅者(subscribe)接受消息。
启动两个Redis客户端
订阅者: subscribe
发布者: publish
五、事务
(一)简介
redis事务与mysql事务不同,redis的事务是队列,没有ACID特性。
- multi 开启事务
- 组队阶段:设置队列
- discard 放弃组队
- exec 执行事务
- 执行阶段:执行队列
例:
multi set k1 v1 set k2 v2 ket k3 v3 exec
提示:ok;ok;ok;
失败例1:
multi set k1 v1 set k2 v2 set k3 exec
提示:(error) EXECABORT Transaction discarded because of previous errors.
在组队中就有语法错误,所有命令都不执行
失败例2:
multi set k1 v1 incr k1 set k2 v2 exec
提示:ok ; error; ok;
在组队中没有语法错误,执行中有错误,只有错误的命令不执行
(二)悲观锁和乐观锁
悲观锁:假定获取数据会修改。在执行前上锁,其他线程不能调用,在执行后解锁,其他线程才可以调用。适用于多写操作。
乐观锁:假定获取数据不会修改。拿取数据时不会上锁,更新数据时会校验 版本号 是否一致。适用于多读操作。
watch key [ key … ] 监听一个或多个key
unwatch key [ key … ] 取消监听一个或多个key
(三)redis事务三特性
(1)单独的隔离操作。事务中的命令都会序列化、按顺序执行。事务执行不会 被其他客户端的命令打断。
(2)没有隔离等级的概念。事务执行之前,命令没有实际执行。
(3)不能保证原子性。事务中命令没有错误,执行中遇到错误,其他命令正常执行。没有回滚。
六、redis的主从复制
(一)简介
redis构成一主(master)多从(slave)的结构,主数据库中的数据复制到从数据库中,客户端对主数据库进行写操作,对从数据库进行读操作。不能多个主同时存在(一山不容二主)。
(二)搭建一主多从
运行三个redis数据库
docker run -p 6379:6379 -d redis:6.2.1 redis-server 45acac3e5251 docker run -p 6380:6379 -d redis:6.2.1 redis-server 22ea8de0ec4b docker run -p 6381:6379 -d redis:6.2.1 redis-server 163c84c30f0a
查看容器内网ip地址
master docker inspect 45acac3e5251 172.17.0.2 slave docker inspect 22ea8de0ec4b 172.17.0.3 docker inspect 163c84c30f0a 172.17.0.4
三个redis数据库进入客户端
docker exec -it 45acac3e5251 redis-cli docker exec -it 22ea8de0ec4b redis-cli docker exec -it 163c84c30f0a redis-cli
在从服务器中输入
slaveof 172.17.0.2 6379 连接主服务器
在主-从服务器中分别输入
info replication 查看主从复制配置
主服务器显示
# Replication role:master connected_slaves:2 slave0:ip=172.17.0.4,port=6379,state=online,offset=1918,lag=0 slave1:ip=172.17.0.3,port=6379,state=online,offset=1918,lag=0 master_failover_state:no-failover master_replid:3a62db6f4c83f53a7a3e59e90a2c618b5056b587 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1918 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1918
从服务器显示
# Replication role:slave master_host:172.17.0.2 master_port:6379 master_link_status:up master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:1904 slave_priority:100 slave_read_only:1 connected_slaves:0 master_failover_state:no-failover master_replid:3a62db6f4c83f53a7a3e59e90a2c618b5056b587 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1904 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1904
连接成功后,从服务器会复制主服务器的数据。
(三)3种模式
①一主二仆:详细操作见(二)
②薪火相传(一脉相承/单线联系):
0号从服务器(172.17.0.3) 连接主服务器(172.17.0.2)
slaveof 172.17.0.2 6379
号从服务器(172.17.0.4) 连接0号从服务器(172.17.0.3)
slaveof 172.17.0.3 6379
③反客为主(脱离从属关系):
在从服务器中输入:
slaveof no one 不是任何人的从属