redis_入门

Redis_day01

1. NoSql

1.1 NoSql是什么

NoSQL(不仅仅是SQL not only SQL),泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题;

(a) nosql 它是非关系型数据库

(b) nosql 解决网站里面 大数据和高并发的问题(SNS社交网络上面/电商/12306)

1.2 NoSql数据库的分类(特点)

Key-value(键值对形式)NoSql数据库

2. redis的认识

(1) redis开源 高性能nosql数据库,数据可以存储在内存或磁盘上面

(2) Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构

包括 list set map(hash) string等

3. Redis特点

(1) 数据存储内存,速度比较快

(2) 支持类型比较多

string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。

(3) 支持磁盘存储 -- 完成持久化操作

(4) 支持数据的过期

(5) 支持集群操作

(6) 支持订阅和发布

4. redis的使用场景

(1)redis使用最多的地方 就是缓存 --(内存最多)

(2)可以处理大数据量的计数问题 --(微博转发 点赞)

(3)实时的攻防系统

银行登录 (登出多少次 会锁定) --暴力破解(穷举法)

(4)有效期应用 -- 优惠劵

(5)自动去重应用 -- set

(6)队列的结构 -- (FIFO) (list存储) -->消息队列(RabbitMQ) --地铁

(7)消息订阅和发布

5. redis使用

5.1 安装

下载后直接解压即可

5.2 启动服务和客户端

 

 

 

 

 

5.3 String的操作命令

set key value

get key

5.4 key的操作命令

keys *

expire key second

ttl key

5.5 list操作

lpush/rpush key value1/value2

lrange key start end

lindex key index

5.6 set操作

sadd key val1 /val2/val3

smembers key

srem key member

5.7 hash操作

hset key name value

hget key name

hmset key name1 key1 name2 key2

hmget key name1 name2

5.8 事务

multi  //标记一个事务块的开始。

exec   //执行所有事务块内的命令。

弱事务 日志

强事务 :同时成功 同时失败-- 金融数据

discard //取消事务,放弃执行事务块内的所有命令。

       Redis事务执行exec指令,批量执行操作,没有回滚操作

5.9 订阅/发布

QQ

SUBSCRIBE channel [channel ...] //订阅给定的一个或多个频道的信息。

PUBLISH channel message //将信息 message 发送到指定的频道 channel 

开一个客户端订阅tv频道

发布nihao!消息tv频道

订阅tv频道的客户端可以收到nihao!消息

5.10 设置密码

1. 通过命令动态调整密码

CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效

CONFIG SET requirepass 123456 //将密码设置为123456

CONFIG SET requirepass "" //清除密码

AUTH 123456  //输入密码进行认证

 

 

 

2. 通过配置文件设置密码

配置文件redis.widows.conf增加一行代码

requirepass 123456

密码123456设置到配置文件中,redis启动时加载该文件,可启用密码

 

 

 

 

6 java代码操作redis

6.1 jar

 

 

 

6.2 简单配置

public void testRedis() throws Exception {
    //连接ip
    String host = "127.0.0.1";
    //连接端口
    int port = 6379;
    //超时时间
    int timeout = 1000;
    Jedis jedis = new Jedis(host, port, timeout);

    //执行操作
    jedis.set("name", "艾瑞利亚");
    System.out.println(jedis.get("name"));
    //关闭连接
    jedis.close();
}
简单连接

 

6.3 连接池连接

 1 public void testPool() throws Exception {
 2     JedisPoolConfig config = new JedisPoolConfig();
 3     config.setMaxIdle(10);
 4     config.setMaxTotal(10);
 5     //获取连接是测试连接是否畅通
 6     config.setTestOnBorrow(true);
 7     //连接ip
 8     String host = "127.0.0.1";
 9     //连接端口
10     int port = 6379;
11     //超时时间
12     int timeout = 1000;
13     JedisPool jedisPool = new JedisPool(config, host, port, timeout);
14     Jedis jedis = jedisPool.getResource();
15     jedis.set("name", "内瑟斯");
16     System.out.println(jedis.get("name"));
17 
18     //查询所有的key   cmd命令key *
19     Set<String> keys = jedis.keys("*");
20     System.out.println(keys);
21 
22     //清空当前数据库
23     jedis.flushDB();
24 }
配置连接池连接

 

6.4 list的操作

 1 public void testPoolList() throws Exception {
 2     JedisPoolConfig config = new JedisPoolConfig();
 3     config.setMaxIdle(10);
 4     config.setMaxTotal(10);
 5     //获取连接是测试连接是否畅通
 6     config.setTestOnBorrow(true);
 7     //连接ip
 8     String host = "127.0.0.1";
 9     //连接端口
10     int port = 6379;
11     //超时时间
12     int timeout = 1000;
13     JedisPool jedisPool = new JedisPool(config, host, port, timeout);
14     Jedis jedis = jedisPool.getResource();
15     jedis.lpush("students", "{name:张三}", "{age:35}", "{sex:男}");
16     List<String> students = jedis.lrange("students", 0, -1);
17     System.out.println(students);
18 }
对list的操作

 

6.5 set的操作

 1 public void testPoolSet() throws Exception {
 2     JedisPoolConfig config = new JedisPoolConfig();
 3     config.setMaxIdle(10);
 4     config.setMaxTotal(10);
 5     //获取连接是测试连接是否畅通
 6     config.setTestOnBorrow(true);
 7     //连接ip
 8     String host = "127.0.0.1";
 9     //连接端口
10     int port = 6379;
11     //超时时间
12     int timeout = 1000;
13     JedisPool jedisPool = new JedisPool(config, host, port, timeout);
14     Jedis jedis = jedisPool.getResource();
15     jedis.flushDB();
16     jedis.sadd("students", "{name:张三}", "{age:35}", "{sex:男}");
17     Set<String> students = jedis.smembers("students");
18     System.out.println(students);
19 }
对set的

 

6.6 hash的操作

 1 public void testPoolHash() throws Exception {
 2     JedisPoolConfig config = new JedisPoolConfig();
 3     config.setMaxIdle(10);
 4     config.setMaxTotal(10);
 5     //获取连接是测试连接是否畅通
 6     config.setTestOnBorrow(true);
 7     //连接ip
 8     String host = "127.0.0.1";
 9     //连接端口
10     int port = 6379;
11     //超时时间
12     int timeout = 1000;
13     JedisPool jedisPool = new JedisPool(config, host, port, timeout);
14     Jedis jedis = jedisPool.getResource();
15     jedis.flushDB();
16     //方式一
17     jedis.hset("student:1", "name", "德莱厄斯");
18     System.out.println(jedis.hget("student:1", "name"));
19 
20     //方式二 map方式(键值都必须为string类型)
21     Map<String, String> map = new HashMap();
22     map.put("name", "德莱文");
23     map.put("age", "32");
24     map.put("sex", "男");
25     jedis.hmset("student01", map);
26     List<String> student01 = jedis.hmget("student01", "name", "age", "sex");
27     System.out.println(student01);
28 }
对hash操作的代码

 

6.7 sort(排序)的操作

public void testPoolSort() throws Exception {
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxIdle(10);
    config.setMaxTotal(10);
    //获取连接是测试连接是否畅通
    config.setTestOnBorrow(true);
    //连接ip
    String host = "127.0.0.1";
    //连接端口
    int port = 6379;
    //超时时间
    int timeout = 1000;
    JedisPool jedisPool = new JedisPool(config, host, port, timeout);
    Jedis jedis = jedisPool.getResource();
    jedis.flushDB();
    //对字符数字操作
    jedis.lpush("nums", "32", "12", "90", "35", "52");
    System.out.println(jedis.sort("nums"));

    //排序规则
    SortingParams params = new SortingParams();
    //倒序    从大到小
    params.desc();
    System.out.println(jedis.sort("nums", params));

    //对英文操作
    jedis.lpush("english", "java", "php", "python", "web");
    SortingParams params1 = new SortingParams();
    //根据ascall值排序
    params1.alpha();
    //正序    从小到大
    params.asc();
    System.out.println(jedis.sort("english", params1));
}
对sort的操作代码

 

6.8 Transaction(事务)的操作

 1 public void testPoolTransaction() throws Exception {
 2     JedisPoolConfig config = new JedisPoolConfig();
 3     config.setMaxIdle(10);
 4     config.setMaxTotal(10);
 5     //获取连接是测试连接是否畅通
 6     config.setTestOnBorrow(true);
 7     //连接ip
 8     String host = "127.0.0.1";
 9     //连接端口
10     int port = 6379;
11     //超时时间
12     int timeout = 1000;
13     JedisPool jedisPool = new JedisPool(config, host, port, timeout);
14     Jedis jedis = jedisPool.getResource();
15     //开启事务
16     Transaction multi = jedis.multi();
17     multi.set("name", "tom");
18     multi.set("age", "24");
19     multi.incr("name");
20     multi.incr("age");
21     //提交事务
22     List<Object> exec = multi.exec();
23     //打印事务执行结果
24     System.out.println(exec);
25 
26     System.out.println(jedis.get("age"));
27 
28     //关闭连接
29     jedis.close();
30     //销毁连接池
31     jedisPool.destroy();
32 }
对事物操作的代码

 

7 redis持久化

为什么需要持久化?

防止数据丢失

怎么持久化?

磁盘存储 内存磁盘

redis如果要实现磁盘存储(做持久化过程) 两种方案

rdb方式 : 在一个时间点内 保存一个数据的快照

save 1 1 1s钟之内至少有一个变化的时候,做持久化

1s 之内的数据 操作时候,丢失,不能做持久化

aof方式 :

追加执行的配置文件的方式 (配置文件就有操作的命令)

posted @ 2020-01-15 19:17  dyier  阅读(...)  评论(...编辑  收藏