初始Redis及其基础
- Redis的核心知识点
- Redis如何选择数据库
- Redis的优点
- Redis的下载和安装
- window安装
- Linux的安装
- 可能会出现的问题
- Redis的基本命令
- 启动命令
- 连接服务
- 测试联通
- 设置key
- 获取key
- 查看Redis目前使用的进程
- 关闭服务
- 判断key是否存在
- 移除key
- 设置key的保留时间
- 查看Redis的key类型
- Redis的String类型
- 追加字符命令
- 获取字符串长度命令
- 增加步长命令
- 获取key的指定位置的内容
- 设置值的过期时间
- 同时设置多个值
- 同时获取多个值
- 同时设置原子性锁
- 设置json字符来保存一个对象
- 其他使用场景
- Redis的List类型
- 放置操作
- 获取操作
- 移除操作
- 通过下标获取值
- 获取列表的长度
- 移除指定的值
- 修剪操作(通过下标进行操作)
- 高级命令
- rpopLpush
- Lset命令
- 插入命令Linsert
- 小结
- Set集合类型
- 添加元素
- 查看元素的所有值
- 判断某一个值是不是在set集合中
- 获取set集合中的内容个数
- 移除set集合中的指定元素
- 随机抽选出set集合的指定个数的元素
- 随机删除key
- 将一个指定的值,移动到另外一个set集合中
- 小结
- Hash哈希类型
- 设置key,value
- 设置多个key,value
- 获取多个key,value
- 获取全部数据
- 删除指定的字段
- 获取长度
- 判读Hash是否存在
- 只获取所有的field,不获取值
- 设置自增,自减
- 小结
- Zset类型
- 插入值
- 排序如何实现
- 移除元素
- 获取个数
- 获取指定区间的指定数量
- 小结
Redis的核心知识点
1、redis默认有16个数据库,默认从第0个开始,这些都可以在redis.conf里面进行查看
2、redis默认不区分大小写
3、redis.conf文件是重点
Redis如何选择数据库
通过命令Select x
来进行数据库的选择
Redis的优点
- Redis是单线程的!redis是非常快的,基于内存操作,CPU不是性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,就使用了单线程单线程操作了。
- Redis是将所有的数据全部放在内存中的,所以使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作),对于内存系统来说,如果没有上下文的切换效率就最高,多次读写都是在一个CPU上的,在内存情况下,这个就是最佳方案
- Redis是以纳秒为单位的
Redis的下载和安装
window安装
必须去GITHub进行下载,但是官方不建议你使用windows来操作Redis,原因是windows版本的Redis目前由微软公司独自维护,并且版本比较低,仅仅可用于简单的学习,国内访问GITHub也可能出现网络问题。
下载方法如下:
1、进入github搜索redis
https://github.com/microsoftarchive/redis/tags
2、进入之后
选择下载tar.gz解压即可使用
其中点击redis-server
即可启动服务,redis-cli
为模拟客户端来使用redis
Linux的安装
1、直接搜索官网链接
https://redis.io/
2、点击download下载即可
3、将压缩包复制到linux中进行解压安装即可
命令如下:
tar -xzvf +redis 压缩包名
make (生成src文件夹)
make install 即可完成下载和安装
可能会出现的问题
1、make可能会出现错误
原因可能是由于你下载的Redis版本太高,而本身linux的gcc编译器版本太低,导致编译失败
Redis的5.0版本需要gcc 4.0以上的版本
Redis的6.0版本需要gcc 5.0以上的版本 (因此不建议最新版本的Redis,或者你可以去升级最新版的gcc)
2、Ubuntu的linux系统无法访问阿里云镜像的问题,在使用apt命令进行下载的时候会出现404的情况,这个原因很可能是由于虚拟机的网络配置和阿里云镜像地址有问题,可以自行百度解决,尝试替换阿里云镜像地址。
3、不同的Linux的虚拟机系统可能下载方式不太一样。
Redis的基本命令
启动命令
本人将redis-conf文件复制了一份到Hconfig文件夹下面,来方便于测试,大家也可以跟着一起创建文件夹
进入你下载的redis目录下面,使用如下命令
redis-server Hconfig/redis.conf
连接服务
redis-cli -p 6379 #这里的6379为端口号,可以自己到conf文件中进行修改,这里默认为6379
测试联通
127.0.0.1:6379> ping
PONG
得到pong回应说明连接成功
设置key
set name cjh
获取key
get name
查看Redis目前使用的进程
ps -ef|grep redis
关闭服务
shutdown
判断key是否存在
EXISTS key
如果存在就返回1,否则返回0
移除key
move key
成功就返回1,否则返回0
设置key的保留时间
expire key time
查看Redis的key类型
type key
Redis的String类型
前面已经在基本命令写了set和get命令,大部分学Redis的人最常使用的就是String类型的命令
追加字符命令
append key "aaaaa"
获取字符串长度命令
strlen key
增加步长命令
incrby key len #key为设置的键 len为你要增加的步长
获取key的指定位置的内容
getrange key 开始位置 结束位置
设置值的过期时间
setex(set with expire)#设置过期时间,默认已经存在
setnx(set if not exist) #如果不存在过期时间就设置过期时间,这个在分布式锁中常常使用,当key不存在时,就将key设置为value,并返回1,如果key存在,就返回0
setex key 过期time 值
setnx key 值
同时设置多个值
mset k1 k2 k3 v1 v2 v3
同时获取多个值
mget k1 k2 k3
同时设置原子性锁
这里k4不存在,由于msetnx是一个原子性操作,因此要么同时成功,要么同时失败
msetnx k1 v1 k4 v4
那么结果很显然就是返回0
设置json字符来保存一个对象
set user:1{name:zhangsan,age:3} #设置一个user:1,对象值为json字符来保存一个对象
因此,你也可以同时获取和输入
其他使用场景
计数器
统计多单位的数量
粉丝数
对象缓存存储
Redis的List类型
前言:在Redis中,我们可以把list玩成栈或者阻塞队列
所有的List命令都是以L开头的
可以把list想象成一个排队的队伍,可以从前面排,也可以从后面排
放置操作
LPUSH list key #从左边放
Rpush list key #从右边放
获取操作
LRANGE list 开始位置 结束位置
移除操作
Lpop list #移除list的第一个元素
Rpo list #移除list的最后一个元素
通过下标获取值
lindex list 1 #获取list中下标为1的元素的值
获取列表的长度
Llen list
移除指定的值
Lrem key 数量(因为一个key可以有多个重复的) 值
修剪操作(通过下标进行操作)
Ltrim key 1 2
这里我放了多个值,但是通过修剪操作,可以修剪掉其他的。
高级命令
rpopLpush
移除当前列表中的最后一个元素,并将它移动到新的列表中,如果新的列表没有创建会自动创建
rpoplpush + 当前列表的名字+ 新的列表的名字
Lset命令
将列表中指定下标的值替换为另外一个值,相当于更新操作,注意:列表需要存在,下标的值也要存在,否则都会报错
Lset list 下标 值
插入命令Linsert
在列表中的某一个值的前面或者后面插入一个值
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
小结
小结:他实际上是一个链表,before Node after ,left,right都可以插入值
如果key不存在,创建新的链表
如果key存在,新增内容
如果移除了key,则为空链表,也代表不存在
在两边插入或者改动值,效率最高!中间元素,相对来说,效率会低一点
Set集合类型
添加元素
sadd key value
查看元素的所有值
smembers key
判断某一个值是不是在set集合中
sismembers key value
获取set集合中的内容个数
scard key
移除set集合中的指定元素
srem key value
随机抽选出set集合的指定个数的元素
SRANDMEMBER key count
随机删除key
spop key
将一个指定的值,移动到另外一个set集合中
smove key1 key2 value #将一个指定的值,从key1移动到key2
小结
set 是无序不重复集合
微博,B站,共同关注(并集)
数字集合类:
*
差集 SDIFF
*
交集 SINTER
*
并集 SUNION
实际作用:
Hash哈希类型
前言:所有的命令以H开头,跟字符串类型的差不多,本质和String类型没有太大的区别,还是一个简单的key-value
Map集合,key-Map集合! ,这个时候的这个值是一个map集合
设置key,value
hset myhash field1 value
设置多个key,value
hmset myhash field1 value1 field2 value2
获取多个key,value
hmget myhash field1 field2
获取全部数据
hgetall myhash
删除指定的字段
hdel myhash field1
获取长度
hlen myhash
判读Hash是否存在
Hexists myhash field1
只获取所有的field,不获取值
hkeys myhash
设置自增,自减
Hincrby myhash field 增加/减少的值
小结
主要的应用场景:
存储变更数据 (尤其是用户信息的保存,经常变动的信息)
hash更适合于对象的存储
String更适合字符串存储
Zset类型
前言:
最大的作用就是排序
插入值
zset k1 score1 v1
排序如何实现
看下面,这里分别给三名用户 赋予不同的工资,然后按照从小到大的顺序来进行排序
这里也可以附带上值
ZRANGEBYSCORE key min max #将key的最小到最大值根据成绩进行排序
ZREVRANGE # key min max 将key的值从大到小进行排序
移除元素
zrem salary xiaohong #移除rem中的元素
获取个数
zcard salary #获取有序集合中的个数
获取指定区间的指定数量
zcount salary 1 2 #获取1到2的区间的数量
小结
应用场景
set排序,存储班级成绩表,工资排序表
普通消息,1,重要消息,2,带权重进行判断
排行榜功能的实现,取Top N测试