常用命令: Linux环境下
=======================================================================
服务器启动:./redis-server ../redis.conf &
客户端启动: ./redis-cli
服务器关闭:./redis-cli shutdown
(最大的执行效率为:10w/s)
--------------------------------------------------------------------------
中文乱码问题解决方法:启动客户端输入 ./redis-cli --raw
==========================================================================
1.基本密令:
ping 查看是否链接到服务器
dbsize 查看数据库中的数据量 redis默认有16个数据库 (修改数量改redis.conf文件)
select (1-16) 切换数据库
flushdb 清空当前数据库
exit/quit 退出客户端
keys * 查看所有的key (支持统配符:keys k* ,keys wo?d)
exists key key (判断是否存在key)
ttl key (查看还剩的存活时间) 默认永久
expire key n 设置key的存活时间n秒
-----------------------------------------------------------------------
*****解决redis内存不管的方式:换内存大的redis,分存到多个redis服务器*****
-----------------------------------------------------------------------
type key 显示key对应的key的数据类型
del key key key 删除对应的key和value值
2.数据类型的命令(redis可以存放任何形式的字符串)
------------------String-----------------------------------------------
set key value 存放
get key 拿出
incr key 将key的对应的整数+1
decr key 将key的对应的整数-1
key不存在时默认创建并赋值为0,然后加减1
append key value 追加
strlen key 求长度
getrange key x y 取x到y位的字符 (x<y)
setrange key x value 从x位开始替换 (替换的字符串时value值)
mset key1 value1 key2 value2 同时设置多个key
mget key1 key2 同时设置多个key
------------------------Hash(一般存放的是java对象)------------------------
hset key filed value 设置hash数据的key和value flied相当于map中的key
hget key filed 获取对应的hash数据值
hmset key filed1 value1 filed2 value2 设置多个对象和值
hmget key filed1 filed2 获取多个字段的值
hgetall key 显示所有的字段的值
hdel key filed 删除对应的字段值
hkeys key 显示所有的key
hvals key 显示所有的值
hexists key firled 检查是否存在
---------------------------List-----------------------------------------
(rpush)lpush key values 按顺序存放values值 注意添加的顺序
lrange key start n 从start开始取子串
lindex key index 取出指定的下标的值
llen key 统计长度
lrem key count n 删除count个n成员
lset key index value 替换index的值
linsert key before|after pivot values 在指定的值前或者后插入值
---------------------------Set----------------------------------------
sadd key values 添加set集合成员
smembers key 查看成员
sismember key values 判断是否存在values
scard key 统计个数
srem key values 删除成员
srandmember key n 随机显示n个成员 (n<0可能重复)
spop key n 随机删除n个成员
sinter key1 key2 取集合交集
-------------------------Zset(set排序了)------------------------------------------
zadd key n xxx n xxx n xxx 添加集合 (n:数字 xxx:字符串)
zrange key strat n withscores 显示区间类的成员和分数(min->max)
zrevrange key start stop 显示区间类的成员和分数(max->min)
zrem key xxx xxx 删除xxx xxx成员
zrangebyscore key n n++ 显示子在(N,N+)区间的值(-inf:最小值
zrangebyscore key n n++ limit n n++ 取出对应值然然后分页 +inf:最大值)
zcount key min max 统计(min,max)的成员个数
------------------------------------------------------------
zrevrangebyscore key +inf 2000 withscores limit 1 5
降序取出最大值到2000的成员中的5个
zrangebyscore key -inf 5000 withscores limit 1 5
降序取出最小值到5000的成员中的5个
---------------------事务----------------------------------------------
multi 事务开始 (服务端开启一定的空间来存放命名)
exec 事务执行 (服务器开始按顺序执行)
discard 事务放弃
注:如果开启事务的过程中出现语法错误事务自动放弃
如果语法没错但是实际的操作不符合数据本身事务也会执行
输入discard视为自动放弃,事务也不执行
watch机制:意思是当a事务对数据xx做修改时会监控xx的值是否在a执行之前
有变化,如果没有a事务就会对xx进行操作如果有a主动放弃对xx的操作
(即:多个事务在同一时间对数据a进行修改他们就会竞争a的修改权谁拿到谁改)
--------------------------持久化(保证数据一直存在)------------------------------
RDB机制:在指定的时间间隔内将数据集快照写入磁盘中,数据恢复时在读到内存
默认开启的时间:300秒内数据改变10次
缺点:可能会是数据丢失(做缓存无影响)
AOF机制:默认记录对数据的修改的操作,不记录读取
AOF的速度慢,占用内存多,安全性高
RDB:速度快占内存高但是安全性低一些
使用方式:做数据缓存 RDB
做数据库 AOF
切换方式:修改redis.conf文件开启AOF即可
主从复制:多个redis服务器处理一种业务,主要的redis负责数据读取,其他的
链接从redisf负责存入,同时主redis可以写入同时将数据与其他从
redis数据同步但是其他的从redis不能够写入数据
info replication 查看关系信息
slaveof ip port 设置从服务器
slaveof no one 升级为主服务器
-------------------------------哨兵机制------------------------------------------------
redis-sentiner redis自带的监控程序的运行情况,可以监控redis的主从
redis服务器的运行情况,如果主服务器发生故障自动更改生成的从服务器的
一台升级为主,剩下的从服务器链接到新的主服务器
---------------------------------------------------------------------------------------
JAVA代码控制Redis:
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
</dependencies>
代码:
package com.atchengdu.redis;
import redis.clients.jedis.Jedis;
import java.util.List;
public class testspringredis {
public static void main(String[] args) {
//创建jedis对象 然后操作jrdis
String host ="192.xxx.xxx.xxx";//redis的主机地址
int port =6379;//redis的端口号
Jedis jedis=new Jedis(host,port);
//设置访问密码
jedis.auth("123456");
//操作数据
jedis.set("break","豆浆油条");
String aBreak = jedis.get("break");
System.out.println(aBreak);
jedis.mset("lunch","红烧肉","dinner","小面");
List<String> mget = jedis.mget("lunch", "dinner", "break");
for(String s:mget){
System.out.println(s);
}
//查询id=1 student key == student:1
if(jedis.exists("student:1")){
String student =jedis.get("student:1");
}else {
//访问数据库
String student="";
jedis.set("setduent",student);
}
}
}
创建线程池的方式保证安全性:
package com.atchengdu.redisutils;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisGet {
//jedispool对象
private static JedisPool pool;
public static JedisPool open(String host,int port){
if(pool==null){
//设置jedispool线程池属性
JedisPoolConfig config =new JedisPoolConfig();
//设置最大的线程数量
config.setMaxTotal(100);
//设置空闲数
config.setMaxIdle(2);
//设置检查项,避免null的情况
config.setTestOnBorrow(true);
//创建线程池
pool=new JedisPool(config,host,port,6000,"123456");
}
return pool;
}
//关闭
public static void close(){
if (pool!=null){
pool.close();
}
}
}
package com.atchengdu.redis;
import com.atchengdu.redisutils.RedisGet;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import java.util.List;
public class Testrdeis {
public static void main(String[] args) {
String host ="xx.xxx.xxx.xxx";//redis的主机地址
int port =6379;//redis的端口号
Jedis jedis=null;
JedisPool pool=null;
try {
//获取线程池
pool= RedisGet.open(host,port);
//获取jedis对象
jedis = pool.getResource();
List<String> mget = jedis.mget("lunch", "dinner", "break");
for(String s:mget){
System.out.println(s);
}
}catch (Exception e){
e.printStackTrace();
}finally {
//使用结束之后把jedis对象放回去其他的地方可以接着使用
if(jedis!=null){
jedis.close();
}
//关闭poll
RedisGet.close();
}
}
}