Redis学习笔记

 视频教程来自:https://www.bilibili.com/video/BV1S54y1R7SB?p=13

五种数据结构:

redis 是单线程的!基于内存操作,cpu不是redis的性能瓶颈,而是根据机器的内存和网络带宽!

字符串String详解:

String 类似的使用场景: value除了字符串还可以是数字

  • 计数器
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存
127.0.0.1:6379>  select 3  // 切换数据库,redis默认16个数据库,从0开始
OK
127.0.0.1:6379[3]> DBSIZE  // 查看DB大小
(integer) 0

查看数据库所有的key : keys *
清空当前数据库 : flushdb , 默认0号库
清空所有数据库 : flushall
key是否存在 : exists key,存在返回1, 不存在返回0
move key 1 : 移除当前key
expire key 10 : 设置key的过期时间 /单位s
ttl key : 查看当前key的剩余时间
set key : 设置key
get key : 获取key
type key :获取key类型

///////

append key : 在key后面追加字符串,如果不存在则新建
strlen key : 获取字符串的长度
incr key : 自动增一
decr key : 自动减一
incrby key increment : 按步长增量
decrby key increment : 按步长减量

////

getrange key 0 3 : 截取字符串0~3范围
getrange key 0 -1 : 获取所有字符串
setrange key offset value : 从offset位置替换字符串

////

setex key seconds value (set with expire) : #设置并且设定过期时间
setnx key value (set if not exist):#不存在再设置,存在则不变 !(在分布式锁中常常使用)

////

mset k1 value k2 value2 k3 value3 ... : 一次性设置多个键值对
mget k1 k2 k3 ... : 一次性取出多个值
msetnx k1 v1 k4 v4 : msetnx 是一个原子性操作,要么一起成功,要么一起失败

// 对象
set user:1 {name:zhangsan,age:3} #设置一个user:1对象,value为json字符串

// 这里的key是一个巧妙的设计 : user:{id}:{field},如此设计在Redis中完全ok

 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 20
 OK
 127.0.0.1:6379> mget user:1:name user:1:age
 1) "zhangsan"
 2) "20"
 127.0.0.1:6379>

// 组合命令 getset 先get再set 

  127.0.0.1:6379> getset db redis  // 如果不存在,则返回nil ,并且设置新的值
  (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"

哈希hash:变更用户的的数据user name age,尤其是用户信息的保存,经常变动的信息

        更适合存储对象,string更加适合字符串存储.

// Map集合, key - Map(key-vlaue)集合 模型
// 所有的hash命令以h开头
hset key field value : 设置hash值
hmset key field value ...
hget key field : 获取指定field的值
hmget key field field ...
hgetall key : 获取全部数据
hdel key field : 删除指定key中的指定key字段,对于的value值会消失

////
hlen key : 获取指定的hash的长度
exists key : 判断hash是否存在
hexists key field: 判断hash中字段是否存在

////
hkeys : 获取所有的key
hvals : 获取所有的值
hincrby key field increment : 给hash中某个field值增量
hsetnx : 如果存在则不成功,不存在则创建

列表list:

  • 实际上是一个链表,before Node after , left ,right 都可以插入值
  • 如果key不存在,创建新的链表,如果存在则新增内容
  • 如果移除了所有值,空链表,也代表不存在
  • 在两边插入或者修改值,效率最高,中间元素,相对来说效率低一些
  • Lpush Rpop 就是消息队列 
  • lpush lpop 就是栈
// 所有的list命令都是L开头
lpush key value value ... : 设置一个或者多个值到列表的头部
lrange key 0 -1 : 取出全部值,先进后出
rpush key value .. : 设置一个或者多个值到列表的尾部
lpop list : 移除列表第一个值 ,并返回该值
rpop list : 尾部移除一个值 ,并返回该值
lindex list index : 返回指定下标的值
Llen list : 返回列表的长度
lset key inex value : 替换指定下标的值,不存在则报错
linsert : 插入元素进list中某个元素的前面或者后面

// 移除指定的值 : 取消关注
lrem key count value : 移除list中count数量的value

ltrim key start stop : 通过下标截取指定的长度

rpoplpush : 移除列表最后一个元素,添加新的list里面去

集合set:无序不重复集合

// 所有的set命令都是s开头 

sadd key value : 添加值
smembers key : 查看指定set所有元素
sismember key value : 查看该set是否存在value值
scard key : 获取元素集合中内容个数
srem key value : 移除指定元素
srandmember key count : 随机获取指定set中指定个数的元素,可以用来设计抽奖系统
spop key : 随机移除元素

// 将指定的值移动到另外的set集合中
smove set1 set2 value : 移动set1中指定元素到set2中

//
sdiff k1 k2 : k1角度 k1和k2的差集
sinter k1 k2 : k1 k2的交集 , 微博的共同好友功能通过这个实现
sunion k1 k2 : k1 k2 的并集

微博场景 : A用户将所有关注的人放在一个set集合中,将它的粉丝也方法在一个集合中
      共同关注 ,共同爱好, 推荐好友

Zset(有序集合) : 排行榜应用,取Top N测试

// 在set的基础上,增加了一个score值
set       k1 v1 
zset     k1 score v1

zadd key score value : 添加一个值
zrange key 0 -1 : 查看所有的值
zrangebyscore key min max : 对set进行区间筛选
zrangebyscore key -inf +inf : 对set所有数据排序
zrangebyscore key min max withscores : 对set进行区间筛选并且显示score
zrem key member : 移除指定member元素
zcard key : 获取有序集合的个数
zrevrange key start stop withscores : 反向排序,从大到小
zcount key min max : 统计指定区间值的数量

三种特殊数据类型  :

  • geospatial 地理位置: 朋友的定位,附近的人,打车距离计算?

      附近的人 ? 获取所有附近的人的地址,通过半径来查询

geoadd key longitude latitude member : 添加地理位置(经度 纬度 名称)
geopos key member : 查询指定城市的经纬度
geodist key member1 member2 unit : 返回2个位置的距离
georadius key longitude latitude radius km/m withdist withcoord(显示他人的定位信息): 以给定的位置为中心,找出某一半径的元素
georadiusbymember key member radius km : 查看某个位置周边的信息
geohash key member : 将二维的经纬度,转换成一维的hash码

/// geo底层是zset ,因此可以执行zset的移除命令,移除查找geo中的元素
  • Hyperloglog : 网站访问统计 ,0.81%错误率,统计uv任务
基础统计的算法!
优点:占用的内存是固定的,只需要12kb内存,如果从内存的角度来比较Hyperloglog首选

网页的UV(一个人访问一个网站多次,但是还是算作一个访问量)
传统方式,使用set保存用户的id,然后统计set中的元素个数为标准判断!
这个方式如果保存了大量的用户id,就会比较麻烦,我们的目的是为了计数,而不是保存id


如果允许容错,那么一定可以使用Hyperloglog ! 如果不允许,就使用set或者自己的数据类型 pfadd key element : 添加元素 pfcount key : 统计key中的元素个数 pfmerge destkey key1 key2 : 查看并集的数量
  • Bitmap :  统计用户活动信息,活跃不活跃,登录未登录,打卡等
位图 : 数据结构,都是操作二进制位来记录状态,就是只有0和1 两个状态
setbit key offset value : 设置offset值 0 或者1
  打卡举例 : setbit sign 1(周一) 0(未打卡)
getbit key offset : 获取offset值
bitcount key : 获取1的数量

Redis事务 :

Redis事务的本质: 一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!一次性,顺序性,排他性
Redis事务没有隔离级别的概念!
所有的命令在事务中,并没有直接被执行,只有发起exec命令的时候才会执行
Redis单挑命令保证原子性,但是事务部保证原子性

////
开启事务 :multi
入队:输入命令
执行: exec

编译异常(代码有问题/ 命令有错) 事务中所有的命令都不会被执行

运行时异常(1/0)如果事务队列中存在语法错误,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常




监控 :Watch 解除监控unWatch

悲观锁 : 认为什么时候都会出问题,无论做什么都会加锁
乐观锁: 很乐观,认为什么时候都不会出现问题,所以不会上锁!在更新数据的时候判断一下,在此期间是否有人修改过数据
  获取version
  更新的时候比较version

如果发现事务执行失败,就先解锁,获取最新的值,再次监视

redis-benchmark : 一个压力测试工具

// 测试: 100个并发连接, 100000 请求

redis-benchmark -h localhost -p 6379 -c 100 -n 100000
原文地址:https://www.cnblogs.com/padazala/p/12677448.html