一、Redis安装
1.1 WIndows下安装
1.WIN下载地址:https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100
2.下载完毕后,解压到工作目录。
3.双击运行服务 redis-server
4.双击客户端 redis-cli
1.2 Linux下安装
1.下载地址:https://redis.io/ ,注意版本号更高的版本需要更高的GCC版本
2.redis-5.0.8.tar.gz
3.上传服务器linux
4. tar -zxvf redis-5.0.8.tar.gz
5. yum install gcc-c++
6. cd redis-5.0.8 -> make && make install
7. 默认redis的安装路径为 : /usr/local/bin
8. 创建redis的配置目录: mkdir /usr/local/bin/redisconf
9. 复制配置文件: cp /home/redis-5.0.8/redis.conf /usr/local/bin/redisconf
10.可以修改为后台启动:vim redis.conf -->daemonize yes
10. 指定配置文件启动redis服务:redis-server /usr/local/bin/redisconf/redis.conf
11. 连接服务:redis-cli -p 6379
12. 关闭服务:shutdown --> exit
1.3 Redis性能测试工具
redis-benchmark
1.测试:100个并发连接,每个并发100000个请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
1.4 基础知识
redis默认有 16 个数据库,默认使用第 0 个数据库。
切换数据库:select 3
查看所有的数据K: keys *
清空当前数据库:flushdb,清除所有数据库:flushall
redis为单线程的。基于内存操作。性能瓶颈为机器内存和网络带宽。
多线程CPU切换轮转【耗时间】,上下文切换,不一定比单线程快。
redis所有的数据全部在内存中,单线程效率最高。
二、五大数据类型
2.1 String 类型
设置 set key1 1www
获取get key1
追加 append key “oooo”
获取长度 STRLEN key1
自增 浏览量
set views 0
incr views 自增1
decr views 自减1
incr views 2 设置自增2
对象 : set user:1 {name:wang,age:24}
mset user:1:name wang user:1:age 24
mget user:1name user:1:age
2.2 List类型【栈,队列,阻塞队列】
LPUSH list one 多个值插入到列表的头部
LRANGE list 0 -1 通过区间拿到所有的值
LRANGE list 0 1 通过区间拿到所有的值
Rpush list three 插入队列的尾部
Lpop list 移除左侧第一个值
Rpop list 移除右侧第一个值
lindex list 1 通过瞎做获取值
Llen list 得到列表的长度
Lrem list 1 one 移除一个或者多个指定的值
ltrim list 1 2 从1-2截断下来
lset list 0 kkk ;列表指定下标的值更新为另外一个值
2.3 Set类型
Set中的值是不可以重复的
sadd myset “hello” 添加一个值
SMEMBERS myset 查看某个集合的元素
SISMEMBER myset hello 判断某一个元素是否在这个集合中
scard myset 获取Set集合的个数
srem myset hello 移除某一个值
SRANDMEMBER myset 随机取出一个元素
spop myset 随机移除一个元素
SDIFF key1 key2 差集
SINTER key1 key2 交集
SUNION key1 key2 并集
2.4 Hash类型
Map集合,key-map,值是一个map集合,和String类型差不多
更适合对象的存储
hset myhash field1 wangyin 存储一个值
hget myhash field1 取出一个值
hmset myhash field1 hello field2 word 存储多个k-v值
hmget field1 field2 获得多个值
hgetall myhash 取出所有字段值
hdel myhash field1 删除指定的key字段,对应的value也被删除了
hlen myhash 集合长度
hkeys myhash 获取所有的key
hvals myhash 获取所有的值
hset user:1 name wangyi 存储对象属性值
hget user:1 name 获取对象属性值
2.5 Zset类型
在set的基础之上,增加了一个值 ,set k1 v1 zset k1 score v1
zadd myset 1 one 1 为排序
zadd salary 1000 xiaoming
zadd salary 2000 xiaohong
zadd salary 3000 xiaowang
ZRANGEBYSCORE salary -inf +inf 所有的字段升序排序
ZRANGEBYSCORE salary 0 -1 所有的字段降序排序
ZRANGESCORE salary -inf 2500 withscores 查出所有在2500以内带有分数和名字降序排列
zrange salary 0 -1 查询所有
zrem salary xiaohong 移除一个元素
zscard salary 获取有序集合中的个数
三、特殊数据类型
3.1 Geospatia地理位置
朋友定位,附近的人,打车距离查询
规则:两级数据无法导入,一般通过java批量导入
参数 key 值(经度,维度,名称)
redis在redis3.2之后就推出了,计算地理位置信息,两地距离
geoadd china:city 116.40 39.90 beijing 添加地理位置信息
geoadd china:city 121.47 31.23 shanghai
geoadd china:city 106.50 29.53 chongqing
geoadd china:city 114.05 22.54 guangdong
geoadd china:city 120.16 30.24 hangzhou
geoadd china:city 108.96 34.26 xian
geopos china:city beijing xian 获取指定城市的地理位置
geodist china:city beijing shanghai 默认直线距离单位m
geodist china:city beijing shanghai km 单位为km
附近的人?获取所有的地址 ,通过半径来查询定位
4. georadius china:city 110 30 1000 km 维度 查询附近1000km的城市
5. georadius china:city 110 30 1000 km withdist withcoord count 1 周围人定位信息限定数量1
3.2 Hyperloglog 基数统计
不重复的元素的个数,可以接受误差0.81%
优点:占用的内存是固定的,只需要12K的内存。
页面的访问量【UV】,一个人访问一个网站多次,算作一个人。
传统的方式:Set保存用户ID,如果大量的话,比较麻烦,目的为了计数,而不是保存用户ID。
PFadd mykey a b c d e f g h i h 存储
PFCOUNT mykey 计算基数数量
PFMERGE mykey mykey2 合并
3.3 Bitmap 位图场景
只有0和1,两个状态,操作二进制位
统计疫情感染人数: 0 1 0 1 0 0 0 1
统计同户信息,活跃,不活跃,登录, 不登录, 打卡
356天 = 365 bit 46byte足够
测试只有1-周末的打卡记录:周一:1 周二:0
setbit sign 0 1
setbit sign 1 0
setbit sign 2 1
setbit sign 3 1
setbit sign 4 0
getbit sign 3 查看周三有没有打卡
bitcount sign 打卡天数
bitcount sign 0 3 统计周一到周四的打卡记录天数
四、redis事务操作
1.ACID:要么一起成功,要么一起失败。
2.redis单条命令保证原子性,但是事务不保证原子性 ,所有的命令就会被序列化,会按照顺序执行。
3.redis事务没有隔离级别的概念,所有的命令在事务中,没有直接被执行。
4.**redis的事务:**开启事务【multi】–>命令入队【…】–>执行事务【exec】
5.DISCARD:取消事务
五、redis乐观锁
5.1 悲观锁
很悲观,认为什么时候都会出现问题
5.2 乐观锁
1.很乐观,认为神魔时候都不会出现问题,不会上锁,更新数据的时候会比较一下这个期间是否有人修改过。
2.获取版本号
3.更新时候比较version
如:
set money 100
set out 0
watch money 监控监事测试
multi 开启事务
DECRBY money 20 减少20
INCRBY out 20 增加20
exec 执行事务
六、Jedis 客户端
6.1 maven项目添加pom
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.66</version> </dependency>
6.2 连接测试
public class TestJedis{ public static void main(String[] args){ Jedis jedis = new Jedis("127.0.0.1",6379); // 所有的方法全部在jedis中 ......... JSONObject jsonObject = new JSONObject(); jsonObject.put("hello","world"); jsonObject.put("name","reba"); // 事务 Transaction multi = jedis.multi(); String result = jsonObject.toJSONString(); try{ multi.set("user1",result); multi.set("user2",result); int i = 1/0; // 模拟异常 multi.exec(); // 执行事务 }catch(...){ multi.discard(); // 放弃事务 }finally{ jedis.close(); // 关闭连接 } } }