键值存储是一种存储系统,其中的数据以键和值对的形式存储。当我们说内存中键值存储时,是指键值对存储在主存储器(RAM)中。因此,可以说Redis以键值对的形式将数据存储在RAM中。
数据库管理系统将所有内容存储在磁盘中,这使得读取和写入操作非常慢。但是Redis将所有内容存储在主存储器中,这在数据读写中非常快。
但是,我们知道内存是远比磁盘贵的,而且计算机的磁盘一般较大,内存相对很小。所以,如果redis像数据库一样存储大量数据,会导致计算机内存耗尽。因此,redis往往存储少量高频度读写的数据,并且会配置过期。

redis存储数据主要有String,List,Hash,Set,Zset五种数据类型。数据存储默认有16个db,默认选中为第一个db。db选择按0~15的数字标识切换。每一种数据类型都会有对应的存取命令。
- Linux安装
- yum install redis
安装后,配置文件所在路径:/etc/redis.conf
service redis start
启动时,redis会占用端口6379

shell下面,直接运行redis-cli,就可以进入客户端连接

Windows安装
zip文件解压
配置环境变量:将redis安装目录添加到path变量
进入Redis安装目录,安装服务:
redis-server --service-install redis.windows.conf --loglevel verbose

启动服务:需要使用管理员运行cmd或者powshell

停止服务:

卸载服务:(备注,若只是安装,请不要卸载)
redis-server --service-uninstall
客户端连接:(先启动服务哟)

- 127.0.0.1:6379> info
- # Server
- redis_version:5.0.3
- redis_git_sha1:00000000
- redis_git_dirty:0
- redis_build_id:9529b692c0384fb7
- redis_mode:standalone
- os:Linux 4.18.0-240.22.1.el8_3.x86_64 x86_64
- ……
- # 选择db
- 127.0.0.1:6379> select 1
- OK
-
- # 查看所有键(可以筛选)
- 127.0.0.1:6379> keys *
- 1) "will"
- 2) "backup3"
- 3) "backup2"
- 4) "backup1"
-
- # 设置(更新)键值
- 127.0.0.1:6379> set will hello
- OK
-
- # 获取键值
- 127.0.0.1:6379> get will
- "hello"
-
- # 设置键和过期时间
- 127.0.0.1:6379> setex will1 100 0
- OK
-
- # 获取键的剩余时间
- 127.0.0.1:6379> ttl will1
- (integer) 17
-
- # 整数自增操作
- 127.0.0.1:6379> incr will1
- (integer) 1
- 127.0.0.1:6379> get will1
- "1"
-
- # 删除键
- 127.0.0.1:6379> del will1
- (integer) 1
- 127.0.0.1:6379> get will1
- (nil)
字符串 string 是 Redis 最简单的数据结构。基础数据都以字符串形式存储。
其对应的命令就set-get,mset-mget
- # 单个操作
- 127.0.0.1:6379> set will 1
- OK
- 127.0.0.1:6379> get will
- "1"
- 127.0.0.1:6379> set will 1.1
- OK
- 127.0.0.1:6379> get will
- "1.1"
- 127.0.0.1:6379> set will abc
- OK
- 127.0.0.1:6379> get will
- "abc"
-
- # 批量操作
- 127.0.0.1:6379> mset will 1 roy 2 tufei 3
- OK
- 127.0.0.1:6379> mget will roy tufei
- 1) "1"
- 2) "2"
- 3) "3"
相当于C里面的双向链表或者python里面的列表
list的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为O(n)
List有三类用法
- 127.0.0.1:6379> rpush queue 1 2 3 4 5
- (integer) 5
- 127.0.0.1:6379> llen queue
- (integer) 5
- 127.0.0.1:6379> lpop queue
- "1"
- 127.0.0.1:6379> lpop queue
- "2"
- 127.0.0.1:6379> lpop queue
- "3"
- 127.0.0.1:6379> lpop queue
- "4"
- 127.0.0.1:6379> lpop queue
- "5"
- 127.0.0.1:6379> lpop queue
- (nil)
栈的用法:右进右出
- 27.0.0.1:6379> rpush stack 1 2 3
- (integer) 3
- 127.0.0.1:6379> llen stack
- (integer) 3
- 127.0.0.1:6379> rpop stack
- "3"
- 127.0.0.1:6379> rpop stack
- "2"
- 127.0.0.1:6379> rpop stack
- "1"
- 127.0.0.1:6379> rpop stack
- (nil)
像Python的列表一样,通过下标使用List。这种用法需要对链表进行遍历,性能随着参数 index 增大而变差。
- 127.0.0.1:6379> rpush list 1 2 3 4 5
- (integer) 5
- 127.0.0.1:6379> llen list
- (integer) 5
- # 下标获取
- 127.0.0.1:6379> lindex list 1
- "2"
- # 获取下标之间的元素,闭区间
- 127.0.0.1:6379> lrange list 1 3
- 1) "2"
- 2) "3"
- 3) "4"
- # 保留下标之间的元素,闭区间(其他元素会删掉)
- 127.0.0.1:6379> ltrim list 1 3
- OK
- # 获取所有元素
- 127.0.0.1:6379> lrange list 0 -1
- 1) "2"
- 2) "3"
- 3) "4"
3.3 Hash-字典
- 127.0.0.1:6379> hset teacher will python
- (integer) 1
- 127.0.0.1:6379> hset teacher Roy java
- (integer) 1
- 127.0.0.1:6379> hset teacher tufei xingneng
- (integer) 1
- 127.0.0.1:6379> hgetall teacher
- 1) "will"
- 2) "python"
- 3) "Roy"
- 4) "java"
- 5) "tufei"
- 6) "xingneng"
- # 因为是更新,所有是0
- 127.0.0.1:6379> hset teacher tufei 性能
- (integer) 0
- # 对于字典,键的值也可以自增
- 127.0.0.1:6379> hset teacher age 1
- (integer) 1
- 127.0.0.1:6379> hincrby teacher age 1
- (integer) 2
- 127.0.0.1:6379> hget teacher age
- "2"
3.4 set-集合
set 是一个无序的、自动去重的集合数据类型
常见应用为抽奖,可以确保同一个用户不会抽中两次
- 127.0.0.1:6379> sadd 特斯汀 1 2 a
- (integer) 3
- # 重复,不添加
- 127.0.0.1:6379> sadd 特斯汀 1
- (integer) 0
- # 新增
- 127.0.0.1:6379> sadd 特斯汀 b
- (integer) 1
- # 注意,并不是添加的顺序,因为set是无序的
- 127.0.0.1:6379> smembers 特斯汀
- 1) "a"
- 2) "2"
- 3) "b"
- 4) "1"
- # 查询某个元素是否存在
- 127.0.0.1:6379> sismember 特斯汀 a
- (integer) 1
- 127.0.0.1:6379> sismember 特斯汀 c
- (integer) 0
- 127.0.0.1:6379> scard 特斯汀
- (integer) 4
- # 弹出一个,被弹出元素将被删除
- 127.0.0.1:6379> spop 特斯汀 1
- 1) "1"
- 127.0.0.1:6379> smembers 特斯汀
- 1) "a"
- 2) "2"
- 3) "b"
zset 可能是 Redis 提供的最为特色的数据结构,它也是在面试中面试官最爱问的数据结构。
它会自动去重,并对所有元素进行排序
其应用场景也很广泛,比如成绩排名,动态排行等等
- 127.0.0.1:6379> zadd score 80 will
- (integer) 1
- 127.0.0.1:6379> zadd score 88 roy
- (integer) 1
- 127.0.0.1:6379> zadd score 77 tufei
- (integer) 1
- # 按成绩升序输出
- 127.0.0.1:6379> zrange score 0 -1
- 1) "tufei"
- 2) "will"
- 3) "roy"
- # 按成绩降序输出
- 127.0.0.1:6379> zrevrange score 0 -1
- 1) "roy"
- 2) "will"
- 3) "tufei"
- 127.0.0.1:6379> zcard score
- (integer) 3
- # 通过value获取到分数
- 127.0.0.1:6379> zscore score will
- "80"
- # 获取区间内排名
- 127.0.0.1:6379> zrangebyscore score 80 90
- 1) "will"
- 2) "roy"
- # inf 是无穷大的意思(∞)
- 127.0.0.1:6379> zrangebyscore score -inf 80
- 1) "tufei"
- 2) "will"
- # 删除
- 127.0.0.1:6379> zrem score will
- (integer) 1
- 127.0.0.1:6379> zrange score 0 -1
- 1) "tufei"
- 2) "roy"
