Redis基础知识

Posted by Liao on 2020-04-21

一、简介

Redis是一种高性能的NoSQL(not only sql)非关系型数据库,key-value存储。key可以是任意类型,redis底层会转换为string。而value可以是五种的基本类型。

二、启动、状态、结束

1
2
3
systemctl start redis-server
systemctl status redis-server
systemctl stop redis-server
  • 默认端口时6379

  • 有16个数据库,每一个从下标0开始

  • 统一管理密码,16个库同样密码

1
2
3
4
5
6
7
redis-server //启动redis服务
redis-cli //连接服务
DBSIZE //当前数据库key的个数
keys * //查看所有的key
SELECT 7 //选择数据库,默认是0号数据库
FLUSHALL  //清空所有数据库
FLUSHDB //清空当前数据库

三、基本类型

3.1 String类型

key | value(int/string/float)

set key value

get key

incr key 自增

1
2
3
4
5
6
7
8
set string1 liao
get string1

set num 1 //num为key 1为val
get num

incr cnt //key自增1
get cnt

底层数据结构简单动态字符串(SDS)

C语言’\0’作为字符串结尾,而redis的key是任意类型的,如果s=”hello\0world”,’\0’后面的字符串会被截断,不安全,因此Redis重新定义SDS这种数据结构。

应用场景:

1、缓存:查询MySQL前先查询Redis

2、计数:文章的阅读数、视频播放次数,通过incr命令对应次数会加一。

3、共享session:在分布式系统中,用Redis集中管理session,Session数据从Redis中获取即可。(session共享会话)

3.2 Hash类型(散列类型)

key->val 一个键只能对应一个值

hset 插入

hget通过key取出值

hmget取出多个

hlen容器中多少个元素

1
2
3
4
5
6
hset hash1 key1 12
hset hash1 key2 13
hset hash1 key2 14 //修改key2 的值为14
hget hash1 key1
hmget hash1 key1 key2
hgetall hash1

Hash类型的键是由以下两种数据结构作为底层实现:

1、压缩列表(ziplist);压缩列表比字典更节省内存,因此在创建新hash键时,默认时用压缩列表作为底层实现

2、字典(哈希表)

(当ziplist元素超过512,会变成哈希表,或者单个元素大小超过64byte,会变为哈希表)

3.3 List类型

lpush 从左边插入元素

rpop从右边取出元素 (取出来之后会从内存中删除)

llen 容器中元素的个数

1
2
3
4
5
6
rpush key value //从右边插入
lpush list1 a b c //从左边插入3个元素
lpop list1 //取三次,分别是c b a

type list1 //查看类型 list
object encoding list1 // quicklist or ziplist

底层数据结构是:

1、双端链表(quickest)

2、压缩列表(ziplist)

使用场景:

1、消息队列(lpush + rpop / rpush + lpop )

2、栈(lpush+lpop / rpush+rpop)

3.4 Set类型

sadd增加元素

scard查看容器元素个数

srem删除容器元素

sismember查看是否有某个元素

1
2
3
4
5
6
7
8
9
10
sadd set1 12 1 2 3 100 99 98 1 2 3
smembers set1 //打印出set1中的元素 "1" "2" "3" "12" "98" "99" "100" 会自动排序并去重
object encoding set1 // intset的数据类型

sadd set2 12 1 2 3 100 99 98 1 2 3 aaaaaa
object encoding set2 // hashtable的数据类型,无法用int来表示时会转化为hashtable

scard set1 // (integer) 7
srem set1 13
sismember set1 13

底层数据结构:

1、数组O(n):当数据可以用整数表示时,Set合集会被编码为inset的数据结构。

2、哈希表O(1):value为空的字典(dict),当元素个数大于512(可以配置)、或者元素无法用整形表示时,则用哈希表编码

使用场景

1、给用户打标签

2、抽奖

1
2
standmember key [count] //随机获取count个元素
spop key [cout] //随机弹出元素个数

3.5 Zset (Sort Set)类型

score和value是一个整体

1
2
3
4
5
6
7
8
9
zadd zset1 10.1 val1 
zadd zset1 11.2 val2

zadd zset1 100 a 200 b 10 c // key是zset1,value是a分数100,b分数200,c分数10
zrange zset1 0 2 withscores //把0-2范围内的值按分数从小到大列出
zrevrange zset1 0 2 withscores //把0-2范围内的值按分数从大到小列出

zcard zset1 //查看容器元素个数
zrank zset1 val2 //查看val2的排行

底层数据结构

1、压缩列表

2、跳表

应用场景:

1、排行榜

四、使用Redis的优势

1.查询速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

  1. 支持丰富数据类型,支持string,list,set,sorted set,hash

  2. 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

  3. 单线程,Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

  4. 支持事务