何为redis @
根据维基百科的解释,Redis(Remote Dictionary Server)是一个使用 ANSI C编写的支持网络、基于内存、分布式、可选 持久性的 键值对存储数据库。
何为键值对存储?简单举个例子
姓名: 🐔太美
性别: 男
爱好: 唱、跳、rap
类似这种由属性:值组成的信息就叫键值对,那理解redis就很简单了,其存储、索引的核心数据就是类似这样的信息
redis有何用途 @
redis最直接的用途当然是作为缓存了,因为数据库中的数据是存在硬盘上,而硬盘的读写效率远远低于内存。
如果在业务开发中频繁的操作数据库查数据,那性能瓶颈就是硬盘的读写速度了,而如果使用redis作为缓存,将常用的数据存储在内存中,那就能减轻数据库的压力。
除了作为缓存外,redis用途还有很多,例如:
- 分布式锁,Redis 的
SETNX(SET if Not Exists)命令可以实现分布式锁,确保同一时间只有一个客户端能执行临界区代码 - 消息队列,使用 Redis 的 List 结构实现简单的消息队列,或使用 Pub/Sub 功能实现消息发布订阅
- 地理位置服务,利用 Redis 的 GEO 数据类型,实现地理位置相关的功能
- 排行榜,使用 Redis 的 Sorted Set(有序集合)实现实时排行榜
除此之外应该还有更多用途,上述只是比较常用的方式
快速搭建redis @
快速启动一个redis服务当然是使用docker了
docker run --name my-redis -p 6379:6379 -d redis
redis实操 @
首先连接redis服务
redis-cli # 本地直接连接
# 连接指定主机和端口
redis-cli -h 192.168.1.100 -p 6380
# 连接需要密码认证的 Redis
redis-cli -h 192.168.1.100 -p 6379 -a yourpassword
# 或者连接后再认证
redis-cli -h 192.168.1.100 -p 6379
192.168.1.100:6379> AUTH yourpassword
redis默认16个库,类似数组下标从零开始,初始默认使用零号库
select 7 # 切换到7号库
DBSIZE # 查看key的数量
Flushdb # 清空当前库
Flushall # 清空全部的库
常用命令
keys * # 查看所有key
exists [key] # 判断某个key是否存在
move key db # 移除某个库中的key
expire key 秒钟 # 设置生存时间
ttl key # 查看生存时间
type name # 查看类型
学习redis无非是学习其一些命令,在实际的业务中,值的类型多种多样,以下是常见的值类型操作方式
- string (单值单Value)
set key value
get key
del key
append key "123" # 不存在的key进行APPEND,等同于SET,已存在的则追加
STRLEN key # 获取长度
set num 0
incr num # 自增1
decr num # 自减1
incrby num 10
decrby num 10
getrange key 0 -1 # 获取全部的值
getrange key 0 2 # 截取部分字符串
setrange key 1 xx # 替换值
setex(set with expire) # 存在就设置
setnx(set if not exist) # 不存在就设置
mset k1 v1 k2 v2 # 同时设置多个kv对
mget k1 k2 # 返回所有给定key的v
- hash (V是一个键值对)
hget keyname field1 # 获取hash中key的val
hset keyname field1 "str" # 为hash表中字段赋值
hmset keyname field1 "hello" field2 "world" # 设置多个kv到hash表,会覆盖已存在字段
hmget keyname field1 field2
hgetall keyname # 返回所有字段和值
hdel keyname field1 # 删除hash表key中一个或多个指定字段
hlen # 获取哈希表中字段的数量
hexists keyname field1 # 查看hash表的指定字段是否存在
hkeys keyname # 获取hash表中所有域
hvals keyname # 返回所有域的值
hincrby keyname field 1 #为hash表中字段值加增量
- List (单值多Value)
lpush keyname value1 # 将一个或多个值插入到列表头部
rpush keyname value1 # 将一个或多个值插入到列表尾部
lrange keyname start stop # 返回列表中指定区间内的元素,-1表示最后一个元素,-2为倒数第二个元素
lpop list # 移除并返回列表的第一个元素
rpop list # 移除列表的后一个元素
lindex list 0 # 按照索引下标获得元素
llen list # 返回列表长度
ltrim list 1 2 # 列表只保留指定区间内的元素
rpoplpush list1 list2 # 移除列表的后一个元素,并将该元素添加到另一个列表并返回
linsert key before/after pivot value # 用于在列表元素前/后插入元素
- Set (单值多value)
sadd setname value1 value2 ... # 将一个或多个成员元素加入到集合中,不能重复
smember setname # 返回集合中的所有的成员
sismemer setname "key" # 判断成员元素是否是集合的成员
scard setname # 获取集合里的元素个数
srem setname "key" # 移除集合中一个或多个成员元素
srandmember key n # 返回集合中n个随机元素
spop key # 用于移除集合中指定key的一个或多个随机元素
smove myset1 myset2 "str" # 将指定元素从source集合移动到destination集合
sdiff、sinter、sunion # 差集、交集、并集
- zset
zadd key score member # 添加元素,指定权重
zrange key 0 -1 # 返回有序集中,指定区间内的成员
zrangebyscore # 返回有序集合中指定分数区间的成员列表
zrem # 移除有序集中的一个或多个成员
zcard # 计算集合中元素数量
zcount # 计算有序集合中指定分数区间的成员数量
zrank # 返回有序集中指定成员的排名,其中有序集成员按分数值递增(从小到大)顺序排列
zrevrank # 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序