何为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 # 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序