redis使用总结
启动命令:
redis-server redis.conf
停止Redis命令
redis-cli shutdown
进入redis客户端命令:
./redis-cli -h redis服务器IP -p 6379 -a 密码
查看所有的key:
KEYS *
redis客户端 查看数据:
1、 set 集合 key:set
SCARD key #获取集合中元素数量
SMEMBERS key #返回集合中所有的元素
2、hash : key hkey value
根据key和hkey查数据: HGET key hkey
查看key下所有值:HGETALL key
HKEYS key 获取所有字段:
HLEN key 获取key下 字段的个数:
判断 key和field 是否存在: 1是存在 0是不存在
HEXISTS key hkey
3、string : key value
SET key value
get key
4、list : key list
向list里存数据:LPUSHX key value
从左边 取数据:LRANGE key start stop
取最新10条:
LRANGE key -9 -1
根据index取值
LINDEX key 1
查询长度:
LLEN key
从左侧推4条数据:根据下标,0 开始取 可以取出最新的数据。
LPUSH listtest 1 2 3 4
LRANGE listtest 0 3
xxx:6379> LRANGE listtest 0 3
1) "4"
2) "3"
3) "2"
4) "1"
从右侧推4条数据:根据下标0 开始取 可以取出最老的数据。
RPUSH listtest1 1 2 3 4
xxx:6379> LRANGE listtest1 0 3
1) "1"
2) "2"
3) "3"
4) "4"
不管是左边压入还是右边压入,LRANGE listtest1 -9 -1都是取最新的10条
LRANGE listtest1 -9 -1
xxx::6379> LRANGE listtest1 -9 -1
1) "4"
2) "5"
3) "6"
4) "7"
5) "8"
6) "9"
7) "10"
8) "11"
9) "12"
xxx::6379> LRANGE listtest -9 -1
1) "4"
2) "3"
3) "2"
4) "1"
redis部署模式:
redis可以单机、多实例和集群部署。
单机支持万次/s 的请求, 主从集群支持10+万/s 的请求,
单机上启动多个实例:适用于同一台机器上有多个应用,他们的redis数据不共享,可以启动多个实例分别存储多个应用的数据。
集群部署分为:主从结构(读写分离支持高并发,主从节点存相同的数据)、哨兵模式(高并发高可用,主从节点存相同的数据)、集群模式(高并发高可用、各个节点互通,不同节点存储不同的数据,客户端连接一个节点就可以访问到所有节点的数据,大数据量也可以支撑)
redis连接数总结:
redis库中连接数是由redis连接池配置和管理的,有最小连接数,最大活跃连接数和空闲连接数。不同的key值下的操作是相互独立的。
redis的操作线程是单线程在运行,严格来说,Redis Server是多线程的,只是它的请求处理整个流程是单线程处理的。
(如果只有一个应用的一个线程一直操作reds 的一个key不会有并发的问题,但是有多个应用同时操作redis的key,就会有并发安全的问题,如两个客户端同时给一个key下的值从0 循环加1 加1000次,两个应用同时跑的话,最后的结果是个小于2000的数)
单线程处理最大的缺点就是,如果前一个请求发生耗时比较久的操作,那么整个Redis就会阻塞住,其他请求也无法进来,直到这个耗时久的操作处理完成并返回,其他请求才能被处理到。
我们平时遇到Redis变慢或长时间阻塞的问题,90%也都是因为Redis处理请求是单线程这个原因导致的。
所以,我们在使用Redis时,一定要避免非常耗时的操作,例如使用时间复杂度过高的方式获取数据、一次性获取过多的数据、大量key集中过期导致Redis淘汰key压力变大等等,这些场景都会阻塞住整个处理线程,直到它们处理完成,势必会影响业务的访问。
每执行一个redis操作,都会opening RedisConnection 然后又Closing Redis Connection ,这是不是说每次执行redis操作都需要创建一个连接,操作完然后又关闭连接呢?实际上不是这样的,阅读源代码我们可以发现我们对redis的所有操作都是通过回调execute函数执行的,
这里面每次执行action.doInRedis(connToExpose)前都要调用RedisConnectionUtils.getConnection(factory);获得一个连接,进入RedisConnnectionUtils类中,getConnection(factory)最终调用的是doGetConnection(factory, true, false, enableTranactionSupport)这个函数。这个函数我们可以看下api文档,发现实际上并不是真的创建一个新的redis连接,它只是在connectFactory中获取一个连接,也就是从连接池中取出一个连接。当然如果connectFactory没有连接可用,此时如果allowCreate=true便会创建出一个新的连接,并且加入到connectFactory中。
基本上可以确定真实的情况是spring-data-redis已经帮我们封装了连接池管理,我们只需要调用一系列操作函数即可,这给操作redis带来了极大的方便。