redis基本概念
- 简介
redis全称remote dictionary server,即远程字典服务器,是一个高性能的KV分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。 - 特点
- redis支持数据的持久化,即把数据保存到磁盘中
- redis不止支持KV数据类型,还支持list、set、zset、hash等数据结构的存储
- redis支持数据的备份,即主从复制模式的数据备份
- redis作用
- 内存存储和持久化:redis支持异步将内存数据写到硬盘
- 模拟类似于httpsession的功能
- 发布、订阅消息系统
- 定时器、计数器
- 可以做数据库、缓存、消息中间件MQ
- 其他
- redis默认有16个数据库,默认使用第0个
- redis是单线程的,6.0版本后已支持多线程
-
不过在6.0版本后已经支持多线程,只有超级大厂才有需要,不然一般单线程的QPS(11万次/s)已经足够支撑大部分公司的需求
-
redis是基于内存运行的,而且是使用c语言写的,比较贴近计算机的底层,也因此速度很快
-
cpu不是redis的瓶颈,redis的瓶颈是机器内存、网络带宽
-
redis基本操作
- 进入redis
cd /usr/local/bin
redis-server + 配置文件
redis-cli -h localhost -p 6379
- 如果使用
ping
指令不报错则成功
报错Please check the Redis logs for details about the RDB error.
可执行一遍config set stop-writes-on-bgsave-error no
- 退出
shutdown
exit
部分常用公共指令
更加全面详细的指令可上官网 查看
功能 | 指令 |
---|---|
切换数据库 | select {index} |
查看当前数据库大小 | dbsize |
查看当前数据库所有的key | keys * |
清除当前数据库所有数据 | flushdb |
清除所有数据库所有数据 | flushall |
redis五大数据类型
String
String中常用的指令
功能 | 指令 | 备注 |
---|---|---|
添加一个KV | set key value | |
添加一个KV并指定有效时间 | setex key n value | set with expire |
如果不存在key则插入value | setnx key v | 返回1表示插入成功,返回0表示已存在key,不执行操作 |
获取对应key的value | get key | |
批量set | mset k1 v1 k2 v2 msetnx 原子操作,一起成功或一起失败 | |
批量get | mget k1 k2 | |
追加内容 | append key value | 不存在key则自动转为set k v |
返回旧值,设置新值 | getset key value | |
查看对应value长度 | strlen key | |
判断是否存在key | exists key | |
把key移到别的数据库 | move key 1 | 把key移到1号数据库,如果1号数据库已经有这个key,不会覆盖value值 |
删除key | del key | |
查看key类型 | type key | |
设置key过期时间 | expire key 10 | 设置10秒后key过期 |
查看key剩余时间 | ttl key | |
value++ | incr key | |
value += n | incrby key n | |
value– | decr key | |
value -= n | decrby key n | |
获取value部分字符串 | getrange key 0 5 | 截取value下标0到下标5,左闭右闭 |
修改value指定位置字符串 | setrange key n xx | set mykey myvalue setrange mykey 1 xx 结果mxxalue |
List
list数据类型相关的指令都是l开头
功能 | 指令 | 备注 |
---|---|---|
将1个或多个值插入列表头部(左边) | lpush key v1 v2 | |
将1个或多个值插入列表尾部(右边) | rpush key v1 v2 | |
从列表头部(左边)弹出一个值 | lpop key | |
从列表尾部(右边)弹出一个值 | rpop key | |
获取多个数据 | lrange key 0 1 | 0是最后lpush进去的值 |
获取单个数据 | lindex key 0 | 获取0号位置的值 |
返回列表长度 | llen key | |
删除列表中n个指定value的数据 | lrem key 5 hello | 删除列表中最左的5个hello |
截取列表 | ltrim key 0 2 | 列表只保留0-2的数据 |
列队列表尾数据放在新列表头 | rpoplpush source destination | 其他的组合不得行有点奇怪 |
更新列表对应位置的value | lset key 0 newVal | 把key列表的0号下标位置的值改为newVal,不存在下标值会报错 |
插入值 | linsert key before/after v newV | 在列表中的v处的前或后插入newV |
Set
set基本都是s开头的指令
功能 | 指令 | 备注 |
---|---|---|
往set添加value | sadd key v1 v2 | |
查看set中的元素 | smembers key | |
判断某一元素是否在set中 | ismember key v1 | |
获取当前元素个数 | scard key | |
删除指定元素 | srem key v1 v2 | |
从set中随机挑选 n个数 | srandomnumber key n | 默认一个,可指定n个 |
随机移除set中的元素 | spop key | |
把set中的元素移到另一个set | smove set1 set2 v | 没有移到list之类的骚操作,只能是移到set |
取set1对set2的差集 | sdiff set1 set2 | |
取set1对set2的交集 | sinter set1 set2 | |
取set1和set2的并集 | sunion set1 set2 |
Hash
同理hash相关指令多以h开头
hash数据类型可以理解为key下的多个KV(field value)吧,而且大多指令和String数据类型的kv形式差不多。
不过hash更适合对象的存储
个人理解如果不对大佬帮我指正一下哈哈哈哈
功能 | 指令 | 备注 |
---|---|---|
添加数据 | hset key field value | 批量添加 hmset k f1 v1 f2 v2 |
取出数据 | hget key field | 批量取出 hmget k f1 f2 |
显示key下的所有field value对 | hgetall key | 只获取field hkeys key 只获取value hvals key |
删除指定字段 | hdel key field | |
查看key下有多少个KV | hlen key | |
判断是否存在某个k f | hexists key field | |
value+=n | hincrby key field n | |
value-=n | hdecrby key field n |
Zset(有序集合)
与set相比,zset 还要多指定一个score
功能 | 指令 | 备注 |
---|---|---|
往zset添加数据 | zadd key score1 value1 scorer2 value2 | |
查看zset | zrange key 0 -1 | 反序输出 zrevrange key 0 -1 |
排序输出value | zrangebyscore key -inf inf | inf是无穷的意思 可在指令最后加上withscores 可显示出score和value |
移除元素 | zrem key value | |
查看元素数量 | zcard key | |
查看score区间的元素个数 | zcount key 0 5 |
三种特殊数据类型
Geospatial 地理位置
- geoadd
#geoadd添加地理位置
# geoadd key 经度 纬度 value
geoadd china:city 116.40 39.90 beijin
- geopos
#获取key的经度纬度
geopos key value
geopos china:city beijin
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
- geodist
#计算两地直线距离
geodist china:city beijin shanghai km #不写km默认是m
"1067.3788"
- georadius
# 查找指定经纬度半径多少内的元素
georadius china:city 110 30 10000 km
1) "shanghai"
2) "beijin"
# 可指定显示出元素距离,经纬度,元素个数
georadius china:city 110 30 10000 km withdist withcoord count 1
1) 1) "shanghai"
2) "1105.9098"
3) 1) "121.47000163793563843"
2) "31.22999903975783553"
- georadiusbymember
# 用法与georadius一样,只不过由自己指定的经纬度改为指定一个元素
georadiusbymember china:city beijin 10000 km
1) "shanghai"
2) "beijin"
- geohash
# 把二维的经纬度转为一维的字符串
geohash china:city beijin
1) "wx4fbxxfke0"
- geospatial其实是基于set的
# 查看、删除元素可以用set的指令
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "shanghai"
2) "beijin"
127.0.0.1:6379> zrem china:city shanghai
(integer) 1
Hyperloglog
可以用来做基数统计
127.0.0.1:6379> pfadd k1 a b c d e # 添加一组数据
(integer) 1
127.0.0.1:6379> pfcount k1 # 统计个数
(integer) 5
127.0.0.1:6379> pfadd k2 c d e f g
(integer) 1
127.0.0.1:6379> pfcount k2
(integer) 5
127.0.0.1:6379> pfmerge k3 k1 k2 # 合并两组数据
OK
127.0.0.1:6379> pfcount k3
(integer) 7
Bitmap
可用于统计一个只有两种状态的信息(打卡、未打卡,登录、未登录)
127.0.0.1:6379> setbit b 0 0 #存数据
(integer) 0
127.0.0.1:6379> getbit b 0 #取数据
(integer) 0
127.0.0.1:6379> bitcount b #统计一个key中1的个数
(integer) 3