【Redis】Redis入门详解(一)

【Redis】Redis入门详解(一)_第1张图片【Redis】Redis入门详解(一)_第2张图片

(图片来源于网络,侵删)


一、Redis概述

【1】Redis简介

Redis是一个开源的key-value存储系统
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)

【2】Redis特点

  • 高效性:Redis读取的速度是110000次/s,写的速度是81000次/s
  • 原子性:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
  • 稳定性:持久化,主从复制(集群)
  • 其他特性:支持过期时间,支持事务,消息订阅。

【3】Redis适用场景

1 ) 配合关系型数据库做高速缓存
【Redis】Redis入门详解(一)_第3张图片
2 ) 由于其拥有持久化能力,利用其多样的数据结构存储特定的数据
【Redis】Redis入门详解(一)_第4张图片

【4】Redis不适用场景

1 ) 需要事务支持
2 ) 基于sql的结构化查询存储,处理复杂的关系,需要即席查询(用户自定义查询条件的查询)


二、Redis安装

【1】下载redis安装包
方式1:官网下载安装包
redis官网地址:
https://redis.io/
中文网站
http://www.redis.cn/

方式2:直接通过wget下载(redis版本自行修改)
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
【2】解压redis压缩包到指定目录
tar -zxf redis-3.2.8.tar.gz -C /opt/modules
cd /opt/modules
mv redis-3.2.8 redis
【3】安装C程序运行环境

确保虚拟机能够连接外网!!!

redis是由c语言开发的,所以需要安装c语言环境

sudo yum -y install gcc-c++
【4】安装tcl
sudo yum  -y  install  tcl
【5】编译redis
cd /opt/modules/redis/
确保在redis根目录下执行以下编译命令:
sudo make && make install PREFIX=/opt/modules/redis

【Redis】Redis入门详解(一)_第5张图片

只要编译完成之后像上图一样,没有error,就表示编译成功!
【6】修改redis配置文件
先在redis根目录下创建两个文件夹,logs用来存储log日志,redisdata用来存储redis数据持久化的数据

mkdir -p /opt/modules/redis/logs
mkdir -p /opt/modules/redis/redisdata
vim /opt/modules/redis/redis.conf

1)61行左右 修改绑定的主机为本机主机名(表示能访问redis的主机名,可以添加多个IP,中间用空格间隔)
在这里插入图片描述
2)128行左右 修改 no 为 yes,表示redis作为守护线程在后台运行
在这里插入图片描述
3)150行左右,因为在第二步将redis作为守护线程后台运行了,所以该线程的pid保存在pidfile中,可自行修改或者默认,当然如果你没有将redis放置后台,pidfile文件就不会创建
【Redis】Redis入门详解(一)_第6张图片
4)163行左右,redis日志存放的文件,我放在我之前创建的logs目录下,取名 redis.log
在这里插入图片描述
5)247行左右,设置redis内存数据持久化的目录,我放在我之前创建的redisdata目录下
在这里插入图片描述

【7】启动Redis并连接

1)启动redis-server

cd /opt/modules/redis/src

./redis-server ../redis.conf

查看是否启动成功
ps -ef | grep redis

在这里插入图片描述
2)使用redis-cli连接

./redis-cli -h 主机名

看下图表示连接成功

在这里插入图片描述
3)关闭redis-server

方式1:shutdown save|nosave   &&   exit

在这里插入图片描述

方式2: ./redis-cli -h 主机名 shutdown

【Redis】Redis入门详解(一)_第7张图片


三、Redis src目录文件简单介绍

Redis-benchmark:性能测试工具
Redis-check-aof:修复有问题的AOF文件
Redis-check-dump:修复有问题的dump.rdb文件
Redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口


四、Redis 五大数据类型概述

Redis中有五大数据类型,分别为stringlistsethashzset

【1】String

①.String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
②.String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
③.String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

【2】list

①.单键多值
②.Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
③.它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
【Redis】Redis入门详解(一)_第8张图片

【3】set

①.Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的
②.Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)

【4】hash

①.Redis hash 是一个键值对集合
②.Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
③.类似Java里面的Map

【5】zset (sorted set)

①.Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的没有成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
②.因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表


四、Redis CRUD基本入门

字符串STRING:

1.设置KV

方式1:如果k不存在,设置v,如果k存在,则覆盖原始v
    set k v  [EX time] [PX time]
    EX:秒
    PX:毫秒
    
方式2:设置多个kv,如果k不存在,设置v,如果k存在,则覆盖原始v
    mset k1 v1 k2 v2 k3 v3 ...
        
方式3:如果k不存在,设置v,如果k存在,不做任何操作
    setnx k v  
      
方式4:设置多个kv,只有所有k都不存在,才会设置v,否则,不做任何操作(因为Redis具有原子性,是单线程的,要么全部成功,要么全部失败)        
    msetnx k v k2 v2 k3 v3 ...

2.获取V

方式1:根据k获取v,如果没有k,则返回 nil
    get k    
方式2:根据多个k获取多个v,如果没有k,则返回 nil
    mget k1 k2 k3 k4 ..

3.显示数据库中的K

方式1:
    keys *
    keys ?
* 表示任意key
? 表示匹配key为1个字母的,同理:?? 表示匹配key为2个字母

在数据库中随机回返一个key	

randomkey

4.判断是否存在K

exists k
如果存在返回     (integer) 1
如果不存在返回   (integer) 0

5.删除K

del k1 k2 ...

6.获取V长度

strlen k

7.向V中追加字符串

append k v 

8.查看K过期时间

ttl k
-1表示永不过期,-2表示已经过期,其他数字表示剩余过期时间(s)

pttl k
-1表示永不过期,-2表示已经过期,其他数字表示剩余过期时间(ms)

9.设置key过期时间

expire k seconds(s)

10.查看当前数据库的K数量

dbsize 

11.使V自增/自减(只能对v为数字进行操作)

incr k  v自增
decr k  v自减

incrby k step  v自增指定步长(整数)
decrby k step  v自减指定步长(整数)

incrbyfloat k step v自增指定步长(小数)

12.设置KV的同时设置过期时间

setex k 过期时间 v

13.设置新值的同时获取旧值

getset k v 

14.用v覆盖从start开始的值

setrange k start v 

15.获取指定k的v值范围,只不过左闭右闭

getrange k start end  

16.选择其他数据库

select index

17.清空数据库

flushdb  清空当前数据库 	
flushall 清空所有数据库 

18.查询key对应数据的类型

type k 

19.对key进行重命名

Rename oldk newK

20.移除key的过期时间

persist k

列表LIST:

1.向列表左/右边插入一个或多个值

lpush k v1 v2 v3 v4 ...
rpush k v1 v2 v3 v4 ...

将一个值插入到已存在的列表头部	
lpushx k v
将一个值插入到已存在的列表尾部	
rpushx k v

2.从左边/右边取出一个值(如果把所有值取出,则该K也会删除)

lpop k  //从左边
rpop k  //从右边

3.从K1列表右边取出一个值,插入到K2列表左边

rpoplpush k1 k2

4.按照start和stop获取列表指定范围的值(从左到右)

lrange k start stop

start 和 stop 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头)
第二个元素下标是1,以此类推
偏移量也可以是负数,表示偏移量是从list尾部开始计数。
例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推

5.按照索引下标获取某个元素(从左到右)

lindex k index

6.根据索引修改值

lset k index v

7.获取列表长度

llen k

8.截取指定长度值

ltrim k start stop

9.在V的后面插入新的值

linsert k before()/after() v newv

10.删除值

lrem k n v

n 为正数,从左边删除n个v值
n 为负数,从右边删除n个v值
n 为0,删除列表所有v值

Set:

1.将一个或多个member元素加入到集合key中,已经存在于集合的member元素将会被忽略

sadd k v1 v2 v3 ...

2.显示该集合的所有值

smembers k

3.判断集合中的K是否含有V值,有返回1,没有返回0

sismember k v

4.返回该集合的元素个数

scard k

5.删除集合中的某个元素

srem k v1 v2 v3 ...

6.随机从该集合中取出n个值,取出的元素将会从集合中删除

spop k n

7.随机从该集合中取出n个值,取出的元素不会从集合中删除

srandmember k n

8.返回两个集合的交集元素

sinter k1 k2
sinterstore newK k1 k2

9.返回两个集合的并集元素

sunion k1 k2
sunionstore newK k1 k2

10.返回两个集合的差集元素

sdiff k1 k2
sdiffstore newK k1 k2

11.将数据从一个集合移动到另一个集合

smove k1 k2 v
sdiffstore newK k1 k2

Hash:

1.设置hash值

方式1:给K集合中的 mapK设置值为 mapV
    hset k mapK mapV
    
方式2:给K集合中的多个 mapK设置值为 mapV
    hmset k mapK1 mapV1 mapK2 mapV2 ...

2.获取hash值

方式1:获取集合中mapK对应的mapV
    hget k mapK
    
方式2:获取集合中多个mapK对应的mapV
    hmget k mapK1 mapK2 mapK3 ...

3.查看指定hash集合K中,mapK是否存在

hexists k mapK

4.列出指定hash集合K的所有mapK

hkeys k
hgetall k 

5.列出指定hash集合K的所有mapV

hvals k

6.将hash集合K中的mapK对应的mapV值增加num

hincrby k mapK num
hincrbyfloat k mapK num

7.设置hash值,在mapK不存在的情况下才会设置成功

hsetnx k mapK mapV

zset (sorted set):

1.将一个或多个member元素及其score值加入到有序集K中

zadd k score1 v1 score2 v2 ...

2.返回有序集K中,下标在 start 和 stop 之间的元素(左闭右闭)

zrange k start stop [withscores]

3.返回有序集K中,分数在 min 和 max 之间的元素(左闭右闭)

zrangebyscore k min max [withscores]

4.返回有序集K中,分数在 max 和 min 之间的元素(左闭右闭)

zrevrangebyscire k max min [withscores]

5.为元素的score加上num值

zincrby k num v

6.删除该集合下指定值的元素

zrem k v

7.统计该集合指定分数区间内的元素个数

zcount k min max

8.返回该值在集合中的排名,从0开始

zrank k v

都看到这里了,点赞评论一下吧!!!

点击查看

【Redis】Redis入门详解(二)

你可能感兴趣的:(Redis)