redis-server lconfig/redis.conf #指定文件启动 redis-server & #后台启动 -p #指定端口启动
redis-cli -p 6379 ping
flushall 清空全部的16个数据库 flushdb 清空本数据库 ps -ef|grep redis 查询Redis进程 set get select 选择数据库 keys * 查看所有的key exists name 判断name键是否存在 move name 1 移动name到数据库1 expire name 10 设置name过期时长为10 S ttl name 查看name剩余失效时长 type name 查看name类型 redis-benchmark -p 6379 -c 100 -n 10000 测试100个并发,每个并发100000个请求、不加-h 就默认本机
string 字符串 list 列表 set 集合 hash 散列 zset sorted sets 有序集合 bimemaps hyperloglog geospatial
append key hello 在key值后面追加hello key如果不存在,就创建key strlen key 获取key的长度 set views 0 设置初始浏览量为0 incr xx 自增,计数器 Increment/增量,增加 decr xx 自减1 decrement/消耗 incrby xx 10 设置步长,自增10 decrby xx 10 设置步长,自减10 getrange key 0 3 key中0-3的子串 range 界限 getrange key 0 -1 最大子串 setrange key 3 xxx 从3开始替换 setex (set expire) 设置过期时间 setnx (set if not exist) 不存在 设置才会生效1 、 存在 设置不生效0 mset 批量 mget msetnx 原子性操作 一个失败,批量失败 set user:1{name:zhangsan,age:3} 设置一个对象,值为json字符串 getset 组合命令 先get再set
string的使用场景:
计数器 统计多单位的数量 粉丝数 对象缓存存储
list是列表 底层用链表实现 存储有序可重复的值 lpush list 1 头插法 rpush list 1 尾插法 lrange 0 -1 显示结果为倒序 list底层是链表 类似栈 先进后出 列表类型存储了一个有序的字符串列表。常用的操作是向两端插入新的元素。时间复杂度为 O(1)。结构为一个链表。记录头和尾的地址。 lpop 左弹出 第一个 rpop 右弹出 最后一个 lindex list 0 list下标为0的元素 栈顶元素 Llen list 返回列表长度 Lrem 移除 lrem list 1 one 移除一个值:list列表中的one 精确匹配 ltrim list 1 2 以元素下标1-2截取list trim 修剪 rpoplpush XXX 移除列表最后一个元素并push到XXX(一个新列表) lset list 0 xxx 可用于更新元素 linsert list before/after "xxx" xxx 在"xxx"之前/之后插入xxx 链表增删快,链表第一次要找到指针位置为O(n),之后的增删都是O(1) 顺序表查询快 O(1)
在Redis中可以将List作为、栈、队列、阻塞队列
实际上是一个链表,left、right 都可以插入值 如果key不存在,创建新的链表 如果key存在,新增value 移除所有值,空链表 在两边插入效率最高,对中间元素操作,效率会降低
使用场景:消息排队! 消息队列(Lpush Rpush),栈(Lpush Lpop)
set是集合 存储无序且不可重复的值 sadd 添加 smembers set 获取set中的元素 Sismember set XXX 判断XXX在set中是否存在 scard set 获取set集合中的个数值 srem 移除 Srandmember 随机抽选出一个元素 spop 随机移除集合元素 smove myset myset2 XXX 将myset中的XXX移动到myset2中 ************************** 微博,B站,共同关注 数字集合 差集:Sdiff key1 key2 key1和key2的差集 = key1 - (key1 ∩ key2) // A和B的差集 = A - AB 交集:Sinter key1 key2 共同好友就可以这样实现 并集:Sunion key1 key2
微博,A用户将所有关注的人放在一个set集合中! 每个人都唯一,粉丝也可以放在一个集合中
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)
hash key-map 它的值是一个map集合 hset myhash key1 value1 / myhash-->key /set一个key-map hget myhash key1 获取key1的值 hmset 批量set hmget 批量get hgetall xxx 获取xxx的全部键值对 hlen myhash 获取长度 Hexist 判断hash中指定字段是否存在 Hkeys 获取map中所有的key Hvals 获取所有的value Hincrby 递增,参数设置为负数就是递减 Hsetnx myhash XXX xxx 是否存在 不存在 设置才会生效1 、 存在 设置不生效0
hash应用:存储变更的数据 例如:user name age 尤其是用户信息保存
hash更适合用于对象存储,string更适合字符串存储
在set的基础上,增加了一个值,set k1 v1 // zset k1 score1 v1
zadd zmembers zrange myset 0 -1 获取所有的值 zrangebyscore XXX -inf +inf // 显示全部用户,按照XXX从小到大排序 ,inf-->无穷 zrevrange XXX 0 -1 // 按照XXX从高到底排序 zconut myset 1 3 获取指定区间的成员数量 闭区间 zcard 获取有序集合的个数
案例思路: set 排序 存储班级成绩表,工资表排序
普通消息 1 重要消息 2 带权重进行判断
排行榜实现
朋友定位,附近的人,打车距离计算
地球南北两极无法直接添加,有效纬度范围 -85 到 85 一般会下载城市数据,直接通过Java程序一次性导入 有效经度范围从-180到180 key由(纬度,经度,名称)构成
geoadd 添加地理位置 geopos china:city zhengzhou 获取指定城市的经纬度信息 geodist china:city zhengzhou shanghai km 返回两个给定位置之间的距离 georadius china:city 110 30 500 km 根据半径 500 km 查找,110 30 中心点数据 GEORADIUS china:city 110 30 500 km withdist 查找到的对象距离中心点的距离 GEORADIUS china:city 110 30 500 km withcoord 查找到的对象的经纬度坐标 GEORADIUS china:city 110 30 500 km withcoord count 1 /// count限定只能查出来1个 GEORADIUS china:city 110 30 500 km withcoord desc 根据中心的位置,从远到近的方式返回元素 georediusbymember 根据半径查找,但是中心点是已经存在的(例如城市) GEORADIUSBYMEMBER china:city zhengzhou 1000 km geohash 返回geohash对位置进行的编码,用于内部调试,一般用不到 将二维的经纬度转换为一维的字符串,如果·两个字符串越接近,则距离越近
GEO底层实现原理就是 Zset 所以GEO可以使用zset命令
zrange china:city 0 -1 查询 zrem china:city zhengzhou 移除
A{1、1、2、3、4、5} 基数(不重复的元素的个数)= 5 网页的UV(访问量,一个人访问多次还是算作一个人) 传统的方式:set保存用户的ID,然后统计set中的元素数量作为标准,占用内存 hyperloglog优点:占用的内存是固定的,2^64 不同元素的基数,只需要12kb内存!0.81% 错误率 pfadd mykey a a b c d e f g h i j 创建第一组元素 pfcount mykey 数量10 pfmerge mykey3 mykey1 mykey2 // 合并mykey1 mykey2 到 mykey3 , 合并:merge
同时添加两个a的话,数量还是10 适用于页面统计,统计数量
允许容错,hyperloglog 不能容错,用set
位存储 统计疫情感染人数:0101 统计用户信息 活跃、不活跃 | 登录、未登录 | 打卡 365天 = 365 bit , 1字节 = 8 bit 46个字节左右 setbit getbit bitcount