redis 安装:
-下教安装、编译源码安装- brew、apt、yum安装 - docker 方式启动
docker pull redis //拉下镜像
docker run -itd --name redis-test -p 6379:6379 redis //拉完run一下这个容器
docker image inspect redis:latestlgrep-i version //版本信息
docker exec -it redis-test /bin/bash
$ redis-cli
info
默认 Docker 没有redis.conf文件
可以使用docker -v 文件路径映射方式 把当前的宿主机上面的一个文件 映射到docker
$ docker run -p 6379:6379 --name redis01 -v /etc/redis/redis.conf:/etc/redis/redis.conf -v /etc/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
大家都说redis 性能好?怎么体现呢? redis性能测试
docker 容器下
# redis-benchmark -n 100000 -c 32 -t SET,GET,INCR,HSET,LPUSH,MSET //set get incr hset lphsh mest
输出的结果
SET: 82372.32 requests per second
GET: 93109.87 requests per second
INCR: 98328.42 requests per second
LPUSH: 87489.06 requests per second
HSET: 77279.75 requests per second
MSET (10 keys): 70175.44 requests per second
每秒的QBS 9万左右 可以调参数 影响的内容有很多 内存 硬盘 运行大小等等
Redis的五种基本数据结构
1.字符串(string)~ 简单来说就是三种:int、string、byte[]
字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,这便意味着该 类型可以接受任何格式的数据,如 JPEG 图像数据或 json 对象描述信息等。在 Redis 中字符串类 型的 value 最多可以容纳的数据长度是512M。 set/get/getset/del/exists/append
incr/decr/incrby/decrby
注意: 1、字符串 append:会使用更多的内存 *比如 字符串的长度为100 在append 就会默认增大一倍的内存 造成浪费
2、整数共享:如何能使用整数,就尽量使用整数,限制了 redis 内存+LRU * 整数int能够共享但是一定情况下影响了 他本身的淘汰的策略
3、整数精度问题:redis 大概能保证16~,,17-18位的大整数就会丢失精确 (int 整数一般16位数怎么也够用了 大于就用string)
2.散列(hash)- Map ~ Pojo Class
Redis 中的 Hash 类型可以看成具有 String key 和 String value 的 map 容器。
所以该类型非常 适合于存储对象的信息。如 Username、password 和 age。
如果 Hash 中包含少量的字段,那 么该类型的数据也将仅占用很少的磁盘空间。
hset/hget/hmset/hmget/hgetall/hdel/hincrby
hexists/hlen/hkeys/hvals
==> hashmap 的方法
3.列表(list)~ java 的 LinkedList
在 Redis 中,List 类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表 一样,我们 可以在其头部(Left)和尾部(Right)添加新的元素。在插入时,如果该键并不存在,Redis 将 为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据 库中删除。
lpush/rpush/ 左右插入元素
lrange/lpop/rpop 。区间 / 左右弹出元素
4.集合(set)~ java 的 set,不重复的 list
在 redis 中,可以将 Set 类型看作是没有排序的字符集合,和 List 类型一样,我们也可以在该类型 的数值上执行添加、删除和判断某一元素是否存在等操作。这些操作的时间复杂度为O(1),即常量 时间内完成依次操作。
和List类型不同的是,Set 集合中不允许出现重复的元素。
sadd/srem/smembers/sismember ~ set.add, remove, contains, 添加/删除/数字/
sdiff/sinter/sunion ~ 集合求差集,求交集,求并集
- 5.有序集合(sorted set)
sortedset 和 set 极为相似,他们都是字符串的集合,都不允许重复的成员出现在一个 set 中。他们之间的主要差别是 sortedset 中每一个成员都会有一个分数与之关联。redis 正是通过分数来为 集合的成员进行从小到大的排序。sortedset 中分数是可以重复的。
zadd key score member score2 member2... : 将成员以及该成员的分数存放到
sortedset 中 zscore key member : 返回指定成员的分数
zcard key : 获取集合中成员数量
zrem key member [member...] : 移除集合中指定的成员,可以指定多个成员
zrange key start end [withscores] : 获取集合中脚注为 start-end 的成员,
[withscores]参数表 明返回的成员包含其分数
zrevrange key start stop [withscores] : 按照分数从大到小的顺序返回索引从 start 到 stop 之间 的所有元素(包含两端的元素) zremrangebyrank key start stop : 按照排名范围删除元素
Redis的三种高级数据结构
-
Bitmaps:setbit/getbit/bitop/bitcount/bitpos bitmaps 不是一个真实的数据结构。而是 String 类型上的一组面向 bit 操作的集合。由于strings 是二进制安全的 blob,并且它们的最大长度是512m,所以bitmaps能最大设置2^32个不同的 bit。 (位图)
-
Hyperloglogs:pfadd/pfcount/pfmerge 在 redis 的实现中,您使用标准错误小于1%的估计度量结束。这个算法的神奇在于不再需要与需 要统计的项相对应的内存,取而代之,使用的内存一直恒定不变。最坏的情况下只需要12k,就可 以计算接近2^64个不同元素的基数。 (概率学)
-
GEO:geoadd/geohash/geopos/geodist/georadius/georadiusbymember Redis 的 GEO 特性在 Redis3.2版本中推出,这个功能可以将用户给定的地理位置(经度和纬度) 信息储存起来,并对这些信息进行操作。 (附近的人)
Redis到底是多线程还是单线程?
在redis 里所有的版本里 内存处理数据都是单线程
网络io 接入这一方面 redis6 之前是bio的 也就是单线程
后来 redis6 之后改了 改成nio 也就是多线程