redis安装和使用

Redis

一、Redis简介

1、redis是什么

Redis全名REmote DIctionary Server 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(zset/sorted sets)等类型。

2、redis特点

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

3、Redis与其他key-value存储的不同

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

4、redis应用场景

①配合关系型数据库做高速缓存

高频次,热门访问的数据,可以存储在redis中,降低数据库IO

作为布隆过滤器,抵御网络攻击

②多样的数据结构存储持久化数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vWsHZGWS-1642849242177)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220122153621826.png)]

二、Redis安装

1、下载redis

# 需要有wget工具,没有的话安装wget
yum -y install wget
# 下载redis
wget http://download.redis.io/releases/redis-6.2.1.tar.gz
# 解压redis
tar -zxvf redis-6.2.1.tar.gz

2、安装c语言的编译环境

# Centos7 gcc版本默认4.8.3,yum 上版本也是4.8.3,所以无法使用yum进行软件更新,所以使用scl。
# scl软件集(Software Collections),是为了给 CentOS 用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个(而且可能是更新的)版本的方式,同时避免把系统搞乱
# 安装scl源:
yum install centos-release-scl scl-utils-build
# 安装devtoolset
yum install -y devtoolset-8-toolchain
# 激活gcc版本,使其生效
scl enable devtoolset-8 bash
# 测试gcc版本
gcc --version
# scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本,如果要长期使用gcc 8的话,运行如下命令
echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile

3、编译redis

# 进入redis安装好的文件里
cd redis-6.2.1
# 执行make命令开始编译
make
# 如果没有准备好C语言编译环境,make 会报错—Jemalloc/jemalloc.h:没有那个文件
# 解决方案运行 make distclean,安装好c语言编译环境后再执行make

# 跳过make test
make install

4、启动redis

redis安装目录:/usr/local/bin

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hI84g6sd-1642849242182)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220122160007053.png)]

redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何

redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲

redis-check-dump:修复有问题的dump.rdb文件

redis-sentinel:Redis集群使用

redis-server:Redis服务器启动命令

redis-cli:客户端,操作入口

①前台启动redis(不推荐)
# 命令行窗口不能关闭,否则服务器停止
/usr/local/bin/redis-server
②后台启动
# 进入redis安装好的文件里
cd redis-6.2.1
# 拷贝一份redis.conf
mkdir conf
cp ./redis.conf ./conf/
# 修改./conf/redis.conf后台启动设置daemonize no改成yes(第128行)
# 启动redis
/usr/local/bin/redis-server /opt/modules/redis-6.2.1/conf/redis.conf
# 启动客户端
redis-cli
# 多端口启动可以:redis-cli -p6379
# 关闭客户端
redis-cli shutdown
# 多实例关闭,指定端口关闭:redis-cli -p 6379 shutdown
③redis.conf 配置项
序号配置项说明
1daemonize noRedis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进程
2pidfile /var/run/redis.pid当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入 /var/run/redis.pid 文件,可以通过 pidfile 指定
3port 6379指定 Redis 监听端口,默认端口为 6379
4rdbcompression yes指定存储至本地数据库时是否压缩数据,默认为 yes
5dbfilename dump.rdb指定本地数据库文件名,默认值为 dump.rdb
6dir ./指定本地数据库存放目录

三、redis命令

1、redis key操作命令

序号命令说明
1keys *查看当前库所有key,*也可以用于匹配,如a结尾的key:*a。
2exists <key>判断某个key是否存在。
3type <key>返回 key 所储存的值的类型。
4del <key>删除指定的key数据。
5unlink <key>根据value选择非阻塞删除,即仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
6expire <key> <time>为给定的key设置过期时间。
7ttl <key>查看还有多少秒过期,-1表示永不过期,-2表示已过期。
8select <db>默认有16个库从0-15。
9dbsize查看当前数据库的key的数量。
10flushdb清空当前库。
11flushall清空全部库。

2、Redis value为string类型命令

String是Redis最基本的类型,String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

序号命令说明
1set <key> <value> [EX|PX] <time>设置指定 key 的值,EX为设置key的超时秒数,PX为设置key的超时毫秒数,与EX互斥。
2get <key>查询对应键值。
3append <key> <value>将给定的value追加到原值的末尾。
4strlen <key>获得对应key的值的长度。
5setnx <key> <value>只有在 key 不存在时 设置 key 的值。
6incr <key>将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1。
7decr <key>将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1。
8incrby / decrby <key> <步长>将 key 中储存的数字值增减。自定义步长。
9mset <key1> <value1> <key2> <value2> …同时设置一个或多个 key-value对。
10mget <key1> <key2> <key3> …同时获取一个或多个 value 。
11msetnx <key1> <value1> <key2> <value2> …同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。原子性,有一个失败则都失败。
12getrange <key> <起始位置> <结束位置>获得值的范围,类似java中的substring,左闭右闭。
13setrange <key> <起始位置> <value>用 value 覆写key所储存的字符串值,从起始位置开始(索引从0开始)。
14setex <key> <过期时间> <value>设置键值的同时,设置过期时间,单位秒。
15getset <key> <value>以新换旧,设置了新值同时获得旧值。

3、Redis value为List类型命令

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVw3nFE7-1642849242184)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220122165913600.png)]

List的数据结构为快速链表quickList,数据较少时使用的是一块连续的内存,结构为ziplist,当数据较多时,就会转化为quicklist,将ziplist通过双向指针链接起来

序号命令说明
1lpush/rpush <key> <value1> <value2> <value3> …从左边/右边插入一个或多个值。
2lpushx/rpushx <key> <value1> <value2> …将一个或多个值插入到已存在的列表的左边/右边。
3lpop/rpop <key>从左边/右边吐出一个值。当没有值时,这个键会被删除。
4blpop/brpop <key1> <key2> … <timeout>从左边/右边吐出一个值。当没有值时,会阻塞列表直到等待超过timeout秒或发现可弹出元素为止。
4rpoplpush <key1> <key2>从key1列表右边吐出一个值,插到key2列表左边。
5lrange <key> <start> <stop>按照索引下标获得元素(从左到右)当start=0,stop=1时展示全部value。
6lindex <key> <index>按照索引下标获得元素(从左到右)。
7llen <key>获得列表长度 。
8linsert <key> before/after <value> <newvalue>在value的前面/后面插入newvalue,如果有多个value的话会在第一个找到的value前/后插入newvalue。
9lrem <key> <n> <value>从左边删除n个value(从左到右)。
10lset <key> <index> <value>将列表key下标为index的值替换成value。
11ltrim <key> <start> <stop>让列表只保留[start,stop]内的元素,不在指定区间之内的元素都将被删除。从0开始。

4、Redis value为Set类型命令

Set数据结构是dict字典,字典是用哈希表实现的,redis的set是string类型的无序集合。它底层是一个value为null的hash表

序号命令说明
1sadd <key> <value1> <value2> …将一个或多个 value 元素加入到集合 key 中,已经存在的 value 元素将被忽略。
2smembers <key>取出该集合的所有值。
3sismember <key> <value>判断集合 key 是否为含有该 value 值,有1,没有0。
4scard <key>返回该集合的元素个数。
5srem <key> <value1> <value2> …删除集合中一个或多个元素。
6spop <key>移除并返回集合中的一个随机元素
7srandmember <key> <n>随机从该集合中取出n个值。不会从集合中删除 。
8smove <source> <destination> <value>将value元素从source集合移动到destination集合。
9sinter <key1> <key2>返回两个集合的交集元素。
10sunion <key1> <key2>返回两个集合的并集元素。
11sdiff <key1> <key2>返回两个集合的差集元素(key1中的,不包含key2中的)

5、Redis value为Hash类型命令

Redis hash是一个string类型的hash表

序号命令说明
1hset <key> <field> <value>给 key 集合中的 field 键赋值 value。
2hget <key> <field>从 key 集合的 field 键中取出 value。
3hgetall <key>获取在哈希表中指定 key 的所有字段和值。
4hmset <key> <field1> <value1> <field2> <value2> …批量设置key的值。
5hmget <key> <field1> <field2> …获取所有给定 field 键的值。
6hexists <key> <field>查看哈希表 key 中,给定的 field 键是否存在。
7hkeys <key>列出该hash集合的所有field。
8hvals <key>列出该hash集合的所有value。
9hincrby <key> <field> <increment>为哈希表 key 中的域 field 的值加上增量,当且仅当 field 对应的值可以转化为int。
10hincrbyfloat <key> <field> <increment>为哈希表 key 中的域 field 的值加上增量,当且仅当 field 对应的值可以转化为float。
11hsetnx <key> <field> <value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。
12hdel <key> <field1> <field2> …删除一个或多个哈希表字段。

6、Redis value为Zset类型命令

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联了一个评分(score),这个评分 score 被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。

对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sowXsuhX-1642849242185)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220122184951833.png)]

序号命令说明
1zadd <key> <score1> <value1> <score2> <value2> …将一个或多个 value 元素及其 score 值加入到有序集 key 当中。
2zcard <key>获取有序集合的成员数
3zrange <key> <start> <stop> [withscores]返回有序集 key 中,下标在[start,stop]之间的元素;带withscores,可以让分数一起和值返回到结果集。
4zrangebyscore <key> <min> <max> [withscores] [limit]返回有序集 key 中,所有 score 值在[min,max]之间的成员。有序集成员按 score 值递增(从小到大)次序排列;limit表示返回前几条数据。
5zrevrangebyscore <key> <min> <max> [withscores] [limit]同上,改为从大到小排列。
6zincrby <key> <increment> <value>为元素的score加上增量。
7zrem <key> <value>删除 key 集合下,指定值的元素 。
8zcount <key> <min> <max>统计该集合,score 值在[min,max]区间内的元素个数
9zrank <key> <value>返回该值在集合中的排名,从0开始。
10zinterstore <key> <num> <key1> <key2>计算给定的一个或多个有序集的交集的前 num 项并将结果集存储在新的有序集合 key 中
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值