一、Redis入门介绍
1、Redis是什么
Redis:REmote DIctionary Server(远程字典服务)。是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库。
2、Redis特点
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载使用
- Redis不仅仅支持简单的key-value类型数据,同时还提供list、set、zset、hash等数据结构的存储
- Redis支持数据的备份,即master-slave模式的数据备份
3、Redis能做什么
- 内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
- 取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合中
- 模拟类似于HttpSession这种需要设定过期时间的功能
- 发布、订阅消息系统
- 定时器、计数器
4、官方网站
官方网站:http://www.redis.io
中文网站:https://www.redis.com.cn/documentation.html
5、在Linux(Ubuntu)中安装Redis
前提:切换到root用户
- 下载Redis安装包,放在/opt目录下
- 解压安装包,出现redis-6.0.6目录
tar -zxvf redis-6.0.6.tar.gz
- 进入到redis-6.0.6目录,在该目录下执行make命令
在执行make命令前,如果没有gcc环境,首先要安装gcc(linux下的一个c程序编译工具)
Ubuntu命令:apt-get install gcc
在执行make命令时,出现以下错误:
解决上述错误,执行以下两个命令:
atp-get update
atp-get install make
顺利完成后,执行以下两个命令进行安装redis:
make
make install
在/usr/local/bin目录查看redis相关命令:
- 在 linux的根目录/下创建文件夹myredis目录,备份redis.conf文件
- 修改/myredis目录下的redis.conf文件
如果没有vim,安装vim:apt install vim
cd /myredis
vim redis.conf
修改以下内容,退出保存
后台启动设置:daemonize yes
- 查看redis后台进程是否开启命令:redis默认端口 :6379
ps -ef|grep redis
- 启动redis服务命令,在/usr/local/bin目录下:
启动:redis-server /myredis/redis.conf
进入客户端:reids-cli -p 6379
判断redis服务是否启动:输入ping 得到PONG意味启动成功
-
测试:
-
关闭服务:
6、Redis启动后其他基础知识
1.单进程
单进程模型来处理客户端的请求,对读写等时间的响应。Redis的实际处理速度完全依靠主进程的执行效率。
2.默认16个数据库,类似数组下标从0开始,初始默认使用零号库
3.Select命令切换数据库
#切换至第2个库
select 1
4.Dbsize查看当前数据库的key的数量
5.Flushdb:清空当前库
#清空当前库的所有数据
flushdb
6.Flushall:清空全部库
#清空所有库的所有数据
flushall
7.统一密码管理,16个库都是同样的密码,要么都连上要么都连不上
8.Redis索引都是从0开始
9.默认端口是6379
二、Redis数据类型
2.1、Redis的五大数据类型
-
string
string是redis最基本的数据类型,一个redis中字符串value最多可以是512M。
string是二进制安全的。意思是redis的string可以包含任何数据,比如jpg图片或者序列化对象。 -
hash
redis hash 是一个string类型的field和value的映射表,特别适合用于存储对象。
类似Java中的Map<String,Object> -
List
redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表头部或尾部。底层是一个LinkedList -
set
redis的set是string类型的无序集合,它是通过Hashtable实现的 -
Zset
redis zset 和set一样是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一,但分数(score)是可以重复的。
2.2、获得redis常见数据类型操作命令
http://redisdoc.com/
https://www.runoob.com/redis/redis-commands.html
https://www.redis.com.cn/commands.html
2.3、Redis 键(Key)
#查看当前库的所有key
keys *
#查看当前库以“k”开头的key:?匹配一个字符 * 匹配多个字符
keys k?
keys k*
#判断某个key是否存在:exists key
exists k1
#将key值从当前库移动到其他库: move key dbId
move k3 2
#为给定的key设置过期时间:expire key 秒钟
expire k2 10
#查看还有多少秒过期 -1表示永不过期 -2表示已过期 :ttl key
ttl k1
#查看key的值的类型:type key
type k1
#删除key: del key
del key
#修改key的名字 rename key newkey
rename k1 kn
...
2.4、Redis字符串(String)
单值单value
#添加一个k-v
set k1 v1
#取出k1
get k1
#为k1的值追加字符串
append k1 aaaa
#查看k1的值的长度
strlen k1
#对key中存储的数字值进行加减操作:v必须是数字
incr k1 ---k1的值加1
incrby k1 3 ---k1的值加3
decr k1 ---k1的值减1
decrby k1 3 ---k1的值减3
#获取key值指定范围的子串
getrange k1 0 -1 ---获取全部字符串
getrange k1 0 3 ---获取前4个字符
#替换key值中的字符串
setrange k1 0 xxx ---用xxx覆写字符串,从0位置开始
#将v值关联到key,并设置key的过期时间
setex k1 10 v1 ---设置k1的值为v1 过期时间是10秒
#只有在key不存在时设置key的值
setnx k1 v1 ---k1不存在时,设置k1的值为v1
#同时设置一个或多个k-v对
mset k1 v1 k2 v2 ---如果key已存在,则用新值覆盖
#同时设置一个或多个k-v,当且仅当所有给定的key都不存在
msetnx k1 v1 k2 v2 ---如果其中又一个key已存在,则都不插入成功
#同时获取多个key值
mget k1 k2 k3
2.5、Redis列表(List)
单值多value
#将一个值或多个值加入到列表头部
lpush list01 1 2 3 4 --- 4 3 2 1
#将一个或多个值加入到列表尾部
rpush list02 1 2 3 4 --- 1 2 3 4
#获取指定列表指定范围的值:lrange key start stop
lrange list01 0 -1 ---获取全部列表的值
#移除并获取列表的第一个元素
lpop list01 ---从列表头部移除一个元素
rpop list01 ---从列表尾部移除一个元素
#根据索引获取列表指定位置的元素(从头到尾)
lindex list01 2 ---获取list01列表的第三个元素
#获取列表长度
llen list01
#移除N个列表元素
lrem list01 2 3 ---移除列表中的2个3
#对一个列表进行修剪
ltrim list01 0 4 ---保留索引位置0~4的值
#移除一个列表的最后一位数并将其添加到另一个列表的头部,返回取出的数
rpoplpush list01 lito2
#根据索引修改指定位置的值
lset list01 1 3 ---修改list01中1号位置的值为3
#在值1的前面或后面插入一个值
linsert list01 before/after x java ---在x前面或后面插入java
总结:
list是一个字符串链表,left和right都可以插入添加
如果键不存在,创建新的链表
如果键已存在,新增内容
如果值全部移除,对应的键就消失了
链表对头部和尾部的操作效率极高,但对中间的元素操作的效率不高
2.6、Redis集合(Set)
单值多value,且不重复
#向集合中添加元素
sadd set01 1 1 2 2 3 3 --当添加的元素有重复时,只会添加一个进去
#查看集合元素
smenbers set01 ---查看集合中的所有元素
#查看某个元素是否是集合中的元素
sismember set01 1 ---查看1是否存在于set01集合
#获取集合里面的元素个数
scard set01 ---查看set01中的元素个数
#删除集合中元素
srem set01 1 ---删除set01中的1
#从集合中随机取出几个数
srandmember set01 3 ---从set01集合中随机取出3个数
#随机出栈一个值
spop set01 ---随机移除set01中的一个元素
#将key1里的某个值赋给key2
smove set01 set02 3 ---将set01中的3弹出添加到set02中
#差集:sdiff
sdiff set01 set02 ---查看在set01里而不在set02里的值 set01-set02
#交集:sinter
sinter set01 set02 ---查看set01与set02的交集
#并集:sunion
sunion set01 set02 ---查看set01和set02的并集
2.7、R