redis学习笔记(一)

redis基本概念

  1. 简介
    redis全称remote dictionary server,即远程字典服务器,是一个高性能的KV分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。
  2. 特点
  • redis支持数据的持久化,即把数据保存到磁盘中
  • redis不止支持KV数据类型,还支持list、set、zset、hash等数据结构的存储
  • redis支持数据的备份,即主从复制模式的数据备份
  1. redis作用
  • 内存存储和持久化:redis支持异步将内存数据写到硬盘
  • 模拟类似于httpsession的功能
  • 发布、订阅消息系统
  • 定时器、计数器
  • 可以做数据库、缓存、消息中间件MQ
  1. 其他
  • 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

你可能感兴趣的:(redis)