Redis
Redis基础知识
redis了解
redis:redis是单线程的。基于内存操作。cpu并不是影响redis的性能瓶颈,redis的瓶颈是机器的内存和网络带宽。
redis单线程快的原因:redis将所有数据放在内存中,多线程(cpu会上下文切换。会有一定的延迟)。
启动redis服务: redis-server redisconfig/redis.conf
启动redis程序:redis-cli -p 6379
关闭redis服务:shutdown
查看有哪些redis服务:ps -ef|grep redis
基础知识: 1. redis默认有16个数据库,默认使用第0个,可以用select 2 命令切换使用第2个数据库
2. DBSIZE 查看数据库大小
3. keys * 查看所有的key
4.flushdb 清除当前数据库所有信息 flushall 清除全部数据库内容
5.move 移除当前数据库 move name 1
6.expire name 10 设置信息过期时间 10为10秒,根据需要自行设置
redis五大数据类型
Redis-key
1. keys * 查看所有的key
2. set name lili 设置一个name 的key 值为lili
3. get name 获取name这个key的值
4. move name 1 移除name这个key
5. expire name 100 设置name这个key的过期时间为100秒
6. ttl name 查看name这个key的有效时间
7. type name 查看name这个key的数据类型
8. exists name 判断name这个key是否存在
String
可以做计数器等
1.append 向字符串后添加数据 append key1 tiantian ,如果key1不存在则会自动创建一个key1
2.strlen 查看字符串长度
3. incr key执行一次数值加1 decr key执行一次数值减1
或者 incrby key 10 执行一次数值加10 ,decrby同理 适用于浏览量等需要自增自减的数据
4.getrange key1 0 3 获取字符串key1的0-3个字符,如果获取全部就是0 -1,因为默认是从0下标开始的
setrange key2 1 xxx 将字符串key2从下标1开始将其替换成xxx
5. setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。 setex key3 60 hello 设置key3过期时间问60秒,值为hello
setnx 如果这个key不存在,则为这个key设置一个value (适用于乐观锁)
6. mset 批量设置 mset k1 v1 k2 v2 k3 v3 设置了k1 k2 k3三个key 他们的值分别是v1 v2 v3
mget 批量获取值 mget k1 k2 k3 获取k1 k2 k3 的值
msetnx k1 v1 k4 v4如果这个些key不存在,则为这个key设置一个value
7. getset 先get值再set值
List
可以当栈和队列
所有命令以L开头
1. lpush 将一个或多个值插入列表的头部(左) rpush将一个或多个值插入列表的尾部(右边)
2.lrange 通过区间获取具体的值 lrange keylist 0 -1
3.lpop 一出列表的第一个值(左),rpop移除列表的最后一个值(右)
4.lindex 通过下标获取值 lindex list 1 获得list下标为1的值
5. llen 获取列表的长度
6. lrem 移除列表中指定个数的值 lrem list 1 three 移除list中的两个three 或者 lrem list 1 three移除list中的1个three 数值可以自己规定
7.ltrim 截断列表中指定下标长度的值 ltrim mylist 1 2 移除mylist中下标1-2的值 ,执行后表中只有下标1-2的值还存在。保留的是截取的。
8.rpoplpush 移除列表的最后一个元素,并将它移动到一个新的列表中 rpoplpush mylist otherlist
9.lset 将列表中指定下标的值替换 lset otherlist 0 hello 将otherlist中下标问0 的值替换为Hello
10.linsert 可以向某一个元素的前面或者后面插入一个指定的值
linsert mylist before hello hahaha 向mylist中的hello元素前面插入hahaha
linsert mylist afterhello hahaha 向mylist中的hello元素后面插入hahaha
Set
set中的值不能重复
所有指令开头都是s
1.sadd 新建 sadd myset hello 新建一个myset集合,并添加一个元素为hello
2.smemebrs 查看指定set集合的所有值 smembers myset 查看myset集合中的所有元素
3.sismember 判断某一个值是不是在set集合中 sismembers mylist hello 判断hello是否在myset集合中
3.scard 获取集合中的元素个数 scard myset
4.srem 移除set集合中的元素 srem myset hello移除myset集合中的hello元素
5.srandmember 随机抽出指定个数元素 srandmember myset 1 在myset集合中随机抽出1元素,也可抽出多个元素(可做抽奖系统)
6.spop 随机移除集合中的元素
7.将指定的值移动到另外一个set集合中 smove myset otherset nihao 将myset集合中的的nihao元素移动到集合otherset中
8. 差集:sdiff set1 set2 以set1为参照找出set2中没有的元素
交集:sinter set1 set2 找出set1和set2中都有的元素 (可以实现用户的共同关注,推荐好友等)
并集:sunion set1 set2 将set1和set2取并集
Hash
适合于对象的存储
hash值以key-value形式存在 ,在redis中就是 key-hash(map)集合 --> key --(key--value)
命令以H开头
1.hset 新建一个hash集合 hset myhash field1 hello 新建一个myhash集合,向key为field1下添加元素hello
hmset 同事新建多个
2.hget 获取hash集合中的值 hget myhash field1 获取myhash集合中field1下的值
hmget同时获取多个
3.hgetall获取所有hash集合中的值
4.hdel 删除一个指定的字段field hdel myhash field1
5. hlen myhash 获取myhash集合的字段长度
6.hexists myhash field1判断字段field1是否存在
7.hkeys myhash 获取myhash集合中所有field
8.hvals myhash获取myhash集合中所有value
Zset
各种数据排序,工资成绩等等,排行榜
给数据信息带权重执行
命令以Z开头
一个有序集合,在set的基础上增加了一个值
1.zadd 添加 zadd myset 1 one 2 two 3 three 添加一个myset集合1,2,3是他的排序信息,one ,two,three是这个有序集合的值
2.zrange myset 0 -1 查看集合所有值
3.zrangebyscore salary -inf +inf withscore将salary集合按从负无穷到正无穷排序,并加上score信息
zrevrange salary 0 -1从大到小排序
4.zrem 移除元素 rem myset hello移除myset集合中的hello元素
5.zcard 获取有序集合中元素个数
6.zcount 获取区间的元素数量 zcount myset 1 20 获取myset有序集合中 1- 20 区间的元素数量
三种特殊数据类型
geospatial
它可以根据录入的经纬度判断两地之间的距离,方圆半径内的人
地理位置(朋友定位,附近的人)
1.geoadd 添加地理位置信息 ,geoadd 表名 经度 纬度 地点名称 ,注意:显示经度再是纬度,不要写反了
2.geopos 根据地点名称获取经度纬度 geopos china chongqing (获得坐标)
3.geodist china:city shanghai beijing km 获取上海跟北京之间的直线距离 单位是km
4.附近的人,获得所有附近的人的地址
georadius 以给定的经纬度为中心,找出某一半径内的元素
指定地址:georadius china:city 110 30 500 km withdist withcoord count 2以110 30 经度纬度为中心寻找方圆500km内的其他元素城市,并显示其直线 距离 经纬度 count 2可以限制查询数量为2。
指定元素:georadiusbymembers china:city beijing 500 km withdist withcoord count 2 以城市北京为中心查询
5.geohash 将指定城市的二维经纬度转换为一维的字符串 geohash china:city chongqing
6.zrange 查看所有元素
Hyperloglog
基数统计算法,页面统计,数量统计(如果允许容错)有0.081的错误率
1.pfadd 增添 pfadd mykey a b c d e
2.pfcount 统计key的元素数量 pfcount mykey
2.pfmerge 合并key pfmerge mykey2 mykey mykey2 将mykey和mykey1的数据合并到mykey2中
Bitmap
位存储
bitmap位图,操作二进制操作,只有0和1两个状态
只要只有两个状态的数据,就可以用bitmap
比如用bitmap记录周一到周末的打卡
setbit sign 0 1 代表打卡,前面0-6为星期1到6 ,后面0为未打卡 1为打卡
getbit sign 3 代表查看星期四是否打卡 ,返回0 未打卡 1 打卡
bitcount sign 统计打卡的总天数
Redis事务
redis单条命令保证原子性,redis事务不保证原子性,redis没有隔离级别的概念。
redis事务的本质: 一组命令的集合。一个事务中所有命令都会被序列化,在事务执行中,按顺序执行。 一次性,顺序性,排他性。
redis事务流程: 开启事务(multi)——命令入队——执行事务(exec)
127.0.0.1:6379> multi # 开启事务 OK 127.0.0.1:6379(TX)> set k1 vi # 命令入队 QUEUED 127.0.0.1:6379(TX)> set k2 v2 QUEUED 127.0.0.1:6379(TX)> get k2 QUEUED 127.0.0.1:6379(TX)> set k3 v3 QUEUED 127.0.0.1:6379(TX)> exec #exec 执行事务 1) OK 2) OK 3) "v2" 4) OK
127.0.0.1:6379(TX)> discard # discard 取消事务
OK
Redis监视测试
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money # watch监视 乐观锁
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 20
QUEUED
127.0.0.1:6379(TX)> incrby out 20
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 80
2) (integer) 20
127.0.0.1:6379>
Jedis
导入依赖:
<dependencies> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.1.1</version> </dependency> <!--fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.56</version> </dependency> </dependencies>
Redis主从复制
主机负责写。从机负责读。
1.info replication 查看当前端口数据库角色
2. slaveof 127.0.0.1 6379 当前端口数据库认定 主机为127.0.0.1 端口号为6379 的库为 主机
代码认定的主机是暂时的,永久性的认定主机要在redis.conf文件中配置
3.如果主机断开可以使用slaveof no one让自己成为主机
哨兵模式
1. 新建一个 配置文件并进入 vim sentinel.conf
2.添加配置
3. 启动哨兵 redis-sentinel redisconfig/sentinel.conf