一、redis概述

1、认识redis

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库

特征:

  • 键值(key-value)型,value支持多种不同数据结构,功能丰富
  • 单线程,每个命令具备原子性
  • 低延迟,速度快(基于内存、IO多路复用、良好的编码)
  • 支持数据持久化
  • 支持主从集群、分片集群
  • 支持多语言客户端


2、redis应用场景
  • 热点数据的缓存: 作为缓存数据,缓存都是基于内存走
  • 限时业务的运用: 秒杀 存放用户信息 短信保存
  • 计数器相关问题: 点赞量 播放量 访问量
  • 排行榜相关问题:
  • 分布式锁: setnx()
  • 利用set结构的无序性

redis的使用及部署_Redis

3、认识Redis


数据结构

数据关联

查询方式

事务特性

存储方式

扩展性

SQL

结构化(Structured)

关联的(Relational)

SQL查询

ACID

磁盘

垂直

NoSQL

非结构化

无关联的

非SQL

BASE

内存

水平


二、redis持久化存储

  • RDB

Redis 默认开启RDB持久化方式,将内存中的数据写入到磁盘中

优点:

1 适合大规模的数据恢复。

2 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

缺点:

1 数据的完整性和一致性不高;

2 备份时占用内存。

  • AOF (append only file)

Redis 默认不开启,采用日志的形式来记录,并追加到文件中。

优点:数据的完整性和一致性更高

缺点:因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。


2、redis操作
服务器端

①查看帮助⽂档

redis-server --help

客户端

①进入redis环境

redis-cli

②查看帮助⽂档

redis-cli --help

③测试是否连接正常

127.0.0.1:6379> ping
PONG

④切换数据库

127.0.0.1:6379> select 8
OK
127.0.0.1:6379[8]>

⑤关闭数据库

quit

三、redis的数据类型

1、redis的结构

redis是key-value的数据结构,每条数据都是⼀个键值对

- 键的类型是字符串

注意:键不能重复

- 值的类型主要分为五种:

  • 字符串string
  • 哈希hash
  • 列表list
  • 集合set
  • 有序集合zset


string类型

String类型,字符串类型,是Redis中最简单的存储类型。

其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  1. string:普通字符串
  2. int:整数类型,可以做自增、自减操作
  3. float:浮点类型,可以做自增、自减操作

不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512M


常见命令:

SET:添加或者修改已经存在的一个String类型的键值对

127.0.0.1:6379[8]> set name jack#name是键,jack是值

OK


GET:根据key获取String类型的value

127.0.0.1:6379[8]> get name#name是键,输出的结果是字符串

"jack"


MSET:批量添加多个String类型的键值对

127.0.0.1:6379[8]> mset lag1 py lag2 web #lag1是键1,py是值1,lag2是键2,web值2

OK


MGET:根据多个key获取多个String类型的value

127.0.0.1:6379[8]> mget lag1 lag2 #lag1是键1,lag2是键2

1) "py"

2) "web"

DEL:删除

127.0.0.1:6379[8]> del name #name是键

(integer) 1

127.0.0.1:6379[8]> get name

(nil)

127.0.0.1:6379[8]> del lag1 lag2 #删除多个值,其实就是删的键

(integer) 2

INCR:让一个整型的key的值自增1

127.0.0.1:6379[8]> set age 20 #默认值

OK

127.0.0.1:6379[8]> get age

"20"

127.0.0.1:6379[8]> incr age#自增加了1

(integer) 21

INCRBY:让一个整型的key的值自增并指定步长,例如:incrby num 2 让num值自增2

127.0.0.1:6379[8]> incrby age 10 #增长了10

(integer) 31

DECR: 自减

127.0.0.1:6379[8]> decr age #自减1

(integer) 30

DECRBY: 将 key 所储存的值减去指定的减量值

127.0.0.1:6379[8]> decrby age 10#自减了10

(integer) 20

append:追加

127.0.0.1:6379[8]> append name wei #追加了wei

(integer) 7

127.0.0.1:6379[8]> get name

"jackwei"

exists:判断键是否正确

127.0.0.1:6379[8]> exists age #返回1是正确的

(integer) 1

rename:重命名

127.0.0.1:6379[8]> rename age new #将age改名为new

OK

设置过期时间 expire key seconds

127.0.0.1:6379[8]> expire haha 10 #设置“haha”键10秒后过期

(integer) 1

k

PERSIST 命令用于移除指定 key 的过期时间 persist key

127.0.0.1:6379[8]> persist p1 #返回1,说明移除指定时间成功

(integer) 1


查看剩余过期 TTL key

127.0.0.1:6379[8]> ttl haha #还有3秒过期

(integer) 3


创建键的时候就设置过期时间 set key value ex seconds

127.0.0.1:6379[8]> set p2 111 ex 10 #创建的时候设置过期时间

OK


2.list类型

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。

特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。


常见命令:

①LPUSH key element ... :向列表左侧插入一个或多个元素

127.0.0.1:6379[8]> lpush lname g1 g2 g3#向左插入了键g1、g2、g3

(integer) 3


②LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil

127.0.0.1:6379[8]> lrange lname 0 -1

1) "g5"

2) "g2"

3) "g1"

127.0.0.1:6379[8]> lpop lname#移除最左面的第一个元素

"g5"

③RPUSH key element ... :向列表右侧插入一个或多个元素

127.0.0.1:6379[8]> rpush lname g4#向右插入了键g4

(integer) 4

④RPOP key:移除并返回列表右侧的第一个元素

127.0.0.1:6379[8]> lrange lname 0 -1

1) "y5"

2) "g5"

3) "g2"

4) "g1"

5) "g4"

127.0.0.1:6379[8]> rpop lname #移除最右面的第一个元素

"g4"

⑤LRANGE key start end:返回一段角标范围内的所有元素

127.0.0.1:6379[8]> lrange lname 0 -1 #查看0到-1之间的值

1) "g3"

2) "g2"

3) "g1"

4) "g4"

⑥type:查看类型

127.0.0.1:6379[8]> type lname #查看键lname是什么类型

list


⑦linsert: 插入

127.0.0.1:6379[8]> linsert lname before g2 g5#在g2前面插入g5

(integer) 5

127.0.0.1:6379[8]> lrange lname 0 -1

1) "g3"

2) "g5"

3) "g2"

4) "g1"

5) "g4"


⑧lindex:通过下标查值

127.0.0.1:6379[8]> lindex lname 0 #通过下标值0查看

"g3"


⑨lset:修改对应索引的值

127.0.0.1:6379[8]> lset lname 0 y5#修改索引0的值为y5

OK

127.0.0.1:6379[8]> lrange lname 0 -1

1) "y5"

2) "g5"

3) "g2"

4) "g1"

5) "g4"


⑩ltrim:删除以外的值

127.0.0.1:6379[8]> ltrim lname 1 -1#删除1到-1以外的值

OK

127.0.0.1:6379[8]> lrange lname 0 -1

1) "g5"

2) "g2"

3) "g1"


3、hash类型

常见命令

①HSET key field value:添加或者修改hash类型key的field的值

127.0.0.1:6379[8]> hset hname name1 jack #hname键 name1键的类型

(integer) 1

127.0.0.1:6379[8]> keys * #查看所有的键

1) "hname"

2) "p1"

3) "new"

4) "lname"


②HGET key field:获取一个hash类型key的field的值

127.0.0.1:6379[8]> hget hname name1

#查看hname name1值

"jack"


③HMSET:批量添加多个hash类型key的field的值

127.0.0.1:6379[8]> hmset hage q1 1 a2 2 q3 3#批量添加hage的值

OK


④HMGET:批量获取多个hash类型key的field的值

127.0.0.1:6379[8]> hmget hage q1 a2 q3 #显示hage下q1、a2、q3的所有值

1) "1"

2) "2"

3) "3"


⑤HGETALL:获取一个hash类型的key中的所有的field和value

127.0.0.1:6379[8]> hgetall hage#将键和值都显示出来

1) "q1"

2) "1"

3) "a2"

4) "2"

5) "q3"

6) "3"


⑥HKEYS:获取一个hash类型的key中的所有的field

127.0.0.1:6379[8]> hkeys hage #获取hage下的field

1) "q1"

2) "a2"

3) "q3"


⑦HVALS:获取一个hash类型的key中的所有的value

127.0.0.1:6379[8]> hvals hage#查询键中所有的值

1) "1"

2) "2"

3) "3"


⑧HINCRBY:让一个hash类型key的字段值自增并指定步长

127.0.0.1:6379[8]> hget hage a2

"2"

127.0.0.1:6379[8]> hincrby hage a2 3#在原有的基础上增了3个值

(integer) 5


⑨HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

127.0.0.1:6379[8]> hsetnx hage p1 qqq#有相同的键创建失败

(integer) 0

127.0.0.1:6379[8]> hsetnx hage a6 qqq #没有相同的键创建成功

(integer) 1


⑩hlen:查看键下的属性

127.0.0.1:6379[8]> hlen hage #查看hage下有三个属性

(integer) 3


4、set类型

Redis的Set结构特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能


常用命令

①添加数据: sadd key members

127.0.0.1:6379> sadd sname g1 g2 g3 #批量给键添加值

(integer) 3

②查看 :smembers key

127.0.0.1:6379> smembers sname #查看键中的值

1) "g3"

2) "g1"

3) "g2"

③删除: spop key

127.0.0.1:6379> spop sname #随机删除键中指定的值

"g3"

srem key 删除指定元素

127.0.0.1:6379> srem sname g1 #删除指定键中指定的值

(integer) 1

⑤查看元素个数:scard sname

127.0.0.1:6379> scard sname #查看键个数

(integer) 1


5、zset类型
  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 说明:没有修改操作


常用命令:

添加数据 zadd key score1 member1 score2 member2 ...

查看指定范围数据 zrange key start stop

返回score值在min和max之间的成员 zrangebyscore key min max

返回成员member的score值 zscore key member

查看键key包含的元素个数 zcard key

删除指定元素 zrem key member1 member2 ...

移除有序集中,指定排名(rank)区间内的所有成员 zremrangebyrank key start stop

删除权重在指定范围的元素 zremrangebyscore key min max