Redis学习笔记

参考:b站尚硅谷redis6教学视频

1、什么是redis

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

1.1、web1.0

在这里插入图片描述

1.2、解决方案

在这里插入图片描述
在这里插入图片描述

2、常用NoSql之间的对比

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
nosql事务的不支持acid,但是它有事务

什么是ACID

一.什么是事务
事务(Transaction)是并发控制单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
二.事务的 ACID
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 。
一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。比如,当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统在运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性
指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
事务中的所有操作要么全部执行,要么都不执行; 如果事务没有原子性的保证,那么在发生系统 故障的情况下,数据库就有可能处于不一致状态。 因而,事务的原子性与一致性是密切相关的。

3、redis官方网站

  1. redis
  2. 中文官网

4、Linux安装redis

4.1、docker 安装redis

使用docker images安装

4.2、默认的安装目录

root@598fef497cec:/data# cd /usr/local/bin 
root@598fef497cec:/usr/local/bin# ls
docker-entrypoint.sh  redis-benchmark  redis-check-rdb  redis-sentinel
gosu                  redis-check-aof  redis-cli        redis-server
root@598fef497cec:/usr/local/bin# 

5、启动redis

5.1redis-server

使用docker安装,redis已经配置好了环境变量,可以在任何目录使用redis的启动命令

root@598fef497cec:/usr/local/etc/redis# redis-server 
80:C 30 May 2021 03:17:37.674 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
80:C 30 May 2021 03:17:37.674 # Redis version=6.2.3, bits=64, commit=00000000, modified=0, pid=80, just started
80:C 30 May 2021 03:17:37.674 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
80:M 30 May 2021 03:17:37.675 * monotonic clock: POSIX clock_gettime
80:M 30 May 2021 03:17:37.675 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use
80:M 30 May 2021 03:17:37.675 # Failed listening on port 6379 (TCP), aborting.

5.2redis-cli

这个命令是打开redis的客户端,用来执行一些操作

root@598fef497cec:/usr/local/etc/redis# redis-cli 
127.0.0.1:6379>

6、关闭redis-cli

127.0.0.1:6379> exit
root@598fef497cec:/usr/local/etc/redis#

7、关闭redis直接停止docker容器就好

8、登录redis auth 密码

127.0.0.1:6379> auth 123
OK
127.0.0.1:6379>

9、Redis 键(key)操作

1、keys *查看当前所有的key

127.0.0.1:6379> keys *
1) "name"
2) "sex"
3) "age"

2、exists key判断某个key是否存在 ,返回1表示存在,0不存在

127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> 

3、type key查看你的key是仗么类型.

127.0.0.1:6379> type name
string

4、del key删除指定的 key数据

127.0.0.1:6379> del sex
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> 

5、unlink key根据value选择非阻塞删除
仅将keys 从 keyspace元数据中删除,真正的删除会在后续异步操作。

127.0.0.1:6379> keys *
1) "name1"
2) "name"
3) "age"
127.0.0.1:6379> unlink name1  #实际上还存在内存,没有立即删除
(integer) 1
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> 

6、expire key 10 10秒钟:为给定的 key设置过期时间

127.0.0.1:6379> keys *
1) "name"
2) "name2"
3) "age"
127.0.0.1:6379> EXPIRE name2 10
(integer) 1
127.0.0.1:6379> ttl name2
(integer) 3
127.0.0.1:6379> ttl name2
(integer) -2
127.0.0.1:6379> 

7、ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期

127.0.0.1:6379> ttl name2
(integer) -2
127.0.0.1:6379> ttl name
(integer) -1

8、查看当前数据库key的数量
dbsize

127.0.0.1:6379> DBSIZE
(integer) 2

10、切换 Redis 数据库(默认有16个数据库)

select 0~15

127.0.0.1:6379> SELECT 0
OK
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 2
OK
127.0.0.1:6379[2]> SELECT 15
OK
127.0.0.1:6379[15]> SELECT 16
(error) ERR DB index is out of range
127.0.0.1:6379[15]> 

11、清空 Redis 数据库内容

1、清空当前库

127.0.0.1:6379> flushdb 
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 

2、清空所有库

127.0.0.1:6379> FLUSHALL 
OK

12、String数据类型

12.1String简介

在这里插入图片描述

12.2 直接set 就是string类型

127.0.0.1:6379> set s 123
OK
127.0.0.1:6379> type s
string

12.3在后面追加 append key value

127.0.0.1:6379> set s 123
OK
127.0.0.1:6379> append s abc
(integer) 6
127.0.0.1:6379> get s
"123abc"
127.0.0.1:6379> 

12.4 strlen key 获得value的长度

127.0.0.1:6379> strlen s
(integer) 6

12.5 setnx key 只有key不存在的时候才设置这个值

127.0.0.1:6379> get s
"123abc"
127.0.0.1:6379> setnx s 111
(integer) 0
127.0.0.1:6379> get s
"123abc"
127.0.0.1:6379> 

12.6 incr key 让value++

注意:这个incr只有当String类型的value里面全部都是数字才能用

127.0.0.1:6379> set num 123
OK
127.0.0.1:6379> type num
string
127.0.0.1:6379> incr num
(integer) 124
127.0.0.1:6379> get num
"124"
127.0.0.1:6379> 

12.7 decr key value–

让数字的值自减一

12.8 自定义步长进行增加减少

incrby /decrby kye 步长

127.0.0.1:6379> get num
"124"
127.0.0.1:6379> incrby num 6
(integer) 130
127.0.0.1:6379> get num
"130"

12.9 同时操作多个key

12.9.1、mset——同时设置多个key
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
12.9.2、msetnx ——同时设置多个不存在的key(原子性,要么都成功,要么都失败)
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> msetnx k4 v4 k5 v5
(integer) 1
127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"
5) "k5"
127.0.0.1:6379> msetnx k4 v4 k6 v6
(integer) 0
127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k2"
4) "k1"
5) "k5"
127.0.0.1:6379> 

12.10 getrange key star end ——截取value的指定范围的值

127.0.0.1:6379> get name
"123456"
127.0.0.1:6379> getrange name 0 2
"123"
127.0.0.1:6379> 

12.11 setrange key star end ——设置指定位置的value的值(会覆盖原本的)

127.0.0.1:6379> SETRANGE name 1 asd
(integer) 6
127.0.0.1:6379> get name
"1asd56"
127.0.0.1:6379> 

12.12 setex key 过期时间 value——设置key的同时设置过期时间

127.0.0.1:6379> setex age 20 18
OK
127.0.0.1:6379> ttl age
(integer) 16
127.0.0.1:6379> ttl age
(integer) 15
127.0.0.1:6379> ttl age

12.13 getset key——设置了新的值,并获得旧的值

127.0.0.1:6379> get name
"1asd56"
127.0.0.1:6379> getset name 666
"1asd56"
127.0.0.1:6379> get name
"666"
127.0.0.1:6379> 

13、redis 操作的原子性

在这里插入图片描述

14、List列表数据类型

14.1、list简介

在这里插入图片描述

14.2、lpush/rpush key value1 value2…——向双向链表插入值

使用lrange key strat end 查看list的值
lpush是从链表的左侧插入,rpush是从右侧插入。他们都是头插法(先进后出,类似堆栈)

127.0.0.1:6379> lpush list v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> rpush list v1 v2 v3
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "v3"
2) "v2"
3) "v1"
4) "v1"
5) "v2"
6) "v3"

14.3、lpop/rpop key —— 向双向链表取出一个值(取出来后list里面就没有这个值了)

当取完了值后这个key就不存在了
在这里插入图片描述

127.0.0.1:6379> lpop list 
"v3"
127.0.0.1:6379> lpop list 
"v2"
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v1"
3) "v2"
4) "v3"
127.0.0.1:6379> 
127.0.0.1:6379> rpop list 
"v3"
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v1"
3) "v2"

14.3、rpoplpush key1 key2 取出key1最右边的value,插入key2的最左边

这里的key1和key2都是LIst
在这里插入图片描述

127.0.0.1:6379> lrange list 0 -1
1) "v2"
2) "v4"
3) "k4"
4) "v1"
5) "v1"
127.0.0.1:6379> rpoplpush list list
"v1"
127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v4"
4) "k4"
5) "v1"

14.4、lrange list start end ——查看list指定范围的值

使用lrange key strat end 查看list的值
获取所有值

127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v4"
4) "k4"
5) "v1"

14.5、lindex key index——查看指定下标的值

127.0.0.1:6379> lrange list 0 -1
1) "v1"
2) "v2"
3) "v4"
4) "k4"
5) "v1"
127.0.0.1:6379> lindex list 0
"v1"

14.6、llen key——获得list的长度

127.0.0.1:6379> llen list
(integer) 5

14.7、linsert key before v1 v2——在指定的value1前面插入value2

127.0.0.1:6379> linsert list before v1  888
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "888"
2) "v1"
3) "v2"
4) "v4"
5) "k4"
6) "v1"
127.0.0.1:6379> 

14.8、linsert key after v1 v2——在指定的value1后面插入value2

127.0.0.1:6379> linsert list after v1 666
(integer) 7
127.0.0.1:6379> lrange list 0 -1
1) "888"
2) "v1"
3) "666"
4) "v2"
5) "v4"
6) "k4"
7) "v1"
127.0.0.1:6379> 

14.9、lset key index v1——替换指定下标index的值

127.0.0.1:6379> lrange list 0 -1
1) "888"
2) "v1"
3) "666"
4) "v2"
5) "v4"
6) "k4"
7) "v1"
127.0.0.1:6379> lset list 0 999
OK
127.0.0.1:6379> lrange list 0 -1
1) "999"
2) "v1"
3) "666"
4) "v2"
5) "v4"
6) "k4"
7) "v1"
127.0.0.1:6379> 

14.9、lrme key n value ——删除指定value的n个值,从最左边的开始删除n个(因为value可以重复)


在这里插入图片描述

15、Set集合

15.1、Set集合简介

在这里插入图片描述
在这里插入图片描述

15.2、set常见的命令

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值