Redis 入门
安装 Redis
通过指定的配置文件 redis.conf 启动 redis 服务
使用 redis-cli 连接 6379 端口
测试 get、set、keys * 命令
关闭 redis
性能测试
redis-benchmark(官方自带的性能测试工具)
# 测试:100 个并发连接 100000 请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
Redis 基础知识
Redis 默认有 16 个数据库
默认使用的是第 0 个
- select 进行切换数据库
- DBSIZE 查看数据库大小
- flushdb 清空当前数据库
- flushall 清空全部数据库
Redis 是单线程的(6.0 之后是多线程的)
- Redis 是很快的,官方表示 Redis 是基于内存操作,CPU 不是 Redis 性能瓶颈,Redis 的瓶颈是机器内存和网络带宽,既然可以使用单线程来实现,就使用单线程了
Redis 是 C 写的,官方提供数据为 100000+ 的 QPS,不比同样使用 key-value 的 memecache 差
Redis 为什么单线程还这么快?
- 误区 1:高性能的服务器一定是多线程的
- 误区 2:多线程(CPU上下文切换:耗时的操作)一定比单线程效率高(速度:CPU > 内存 > 硬盘)
- 核心:Redis 是将所有的数据全部放在内存中的,所以使用单线程操作效率最高
五大数据类型
Redis-Key
127.0.0.1:6379> set name Jarvis
OK
127.0.0.1:6379> set age 3
OK
127.0.0.1:6379> exists name # 判断当前 key 是否存在
(integer) 1
127.0.0.1:6379> move name 1 # 将当前 key 从当前数据库移到 1 数据库
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> move name 0
(integer) 1
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> expire name 20 # 设置当前 key 20 秒后过期
(integer) 1
127.0.0.1:6379> ttl name # 查看倒计时还有几秒👆
(integer) 16
127.0.0.1:6379> ttl name
(integer) 8
127.0.0.1:6379> ttl name
(integer) 7
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> type name # 查看当前 key 的类型
string
127.0.0.1:6379> type age
string
String(字符串)
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> append key1 "hello" # 追加字符串,如果该键不存在,相当于 set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 # 获取字符串的长度
(integer) 7
127.0.0.1:6379> append key1 ",Jarvis"
(integer) 14
127.0.0.1:6379> get key1
"v1hello,Jarvis"
127.0.0.1:6379>
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views # 相当于 views++ 自增1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> type views
string
127.0.0.1:6379> decr views # 相当于 views-- 自减1
(integer) 1
127.0.0.1:6379> incrby views 10 # 相当于 views += 10
(integer) 11
127.0.0.1:6379> decrby views 10 # 相当于 views -= 10
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> set key1 "hello,Jarvis"
OK
127.0.0.1:6379> get key1
"hello,Jarvis"
127.0.0.1:6379> getrange key1 0 3 # 截取字符串 [0, 3]
"hell"
127.0.0.1:6379> getrange key1 0 -1 # 获取全部字符串
"hello,Jarvis"
127.0.0.1:6379>
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 1 xx # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
# setex(set with expire) 设置到期时间
# setnx(set if not exists) 如果不存在...(在分布式锁中会常用)
127.0.0.1:6379> setex key3 30 hello
OK
127.0.0.1:6379> ttl key3
(integer) 25
127.0.0.1:6379> setnx key4 redis
(integer) 1
127.0.0.1:6379> keys *
1) "key2"
2) "key1"
3) "key4"
127.0.0.1:6379> setnx key4 mongoDB
(integer) 0
127.0.0.1:6379> get key4
"redis"
127.0.0.1:6379>
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 # 同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3 # 同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx key1 v1 key4 v4 # 原子性操作,要么都成功,要么都失败
(integer) 0
127.0.0.1:6379>
# 对象
127.0.0.1:6379> set user:1 {
name:zhangsan,age:3} # 设置一个 user:1 对象,值为 json字符来保存对象
OK
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 12
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "12"
127.0.0.1:6379>
127.0.0.1:6379> getset db redis
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongoDB
"redis"
127.0.0.1:6379> get db
"mongoDB"
127.0.0.1:6379>
String 类型使用场景(value 可以是数字):
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
List
- 基本的数据类型,列表
- 在 Redis 中,可以把 List 玩成 栈、队列、阻塞队列
# l 和 r 是 left 和 right 的意思
# 双端队列
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> rpush list four
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "list"
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list