为什么要使用redis?
场景: 在企业级开发,需要完成导航条的数据,但是导航条的数据一般都是来源于数据库,只要每个人过来看到导航条的数据,都意味着连接了一次数据库,如果有1w人,需要连1w次数据库,在这里,我们发现所有人连接数据库拿到的数据都是一样的,也就意味着这个导航条的数据不是时时更新的数据,既然所有人看到的都一样,那有没有什么更好的方式去解决频繁操作数据库带来效率低的问题 方案: 让第一个访问的人去mysql数据库先获取一份,然后放入内存中,剩下所有的人再去内存中获取即可 解决:使用nosql数据库(redis)解决(缓存技术,memchace) 好处:解决频繁访问数据库带来效率低的问题面试题:非关系数据库和关系型数据库的区别?
关系型数据库:mysql oracle db2 sqlserver.. 特点:数据都在硬盘上,有着表的表的概念,表和表之间有着关系(1vN NvN) 优点:数据的安全性和完整性都高 缺点: 读取慢 非关系型数据库:redis 特点:数据都在内存中,没有表的概念,只有键值对的概念 key(String)=value(5种) 优点:读取极快 缺点:数据的安全性和完整性都不高 if(redis==null){ mysql redis }else{ redis } 企业开发:关系型数据库和非关系型数据库是相辅相成的redis的应用场景?
1 新闻内容 2 聊天室好友 3 12306
双击即打开 开启服务,加载配置文件
redis数据支持的值类型: key键都是字符串 value值是5种
1 字符串类型(掌握) String=String 例如:s1 "abcd" 2 散列类型(掌握) String=hash 例如:s2 username jack 3 列表类型(了解) String=list 例如:s3 a b c d a b c d 无序可以重复 4 集合类型(了解) String=set 例如:s4 a b c d 无序不能重复 5 有序集合类型(了解) String=zset 例如:s5 1 a 2 b 4 c 4 d 5 e把值看成map集合(适合存储对象的属性值) 例如: user1 username jack
设置单个 hset key subkey subvalue :设置一个键值对 获取单个 hget key subkey:获取一个子键的值 设置多个 hmset key subkey1 subvalue1 subkey2 subvalue2 ...:设置多个键值对 获取多个 hmget key subkey1 subkey2...:获取多个子键的值 获取所有属性以属性值 hgetall key:获取指定key值的所有信息 删除-子键 hdel key subkey1 subkey2 ... 删除 del keyredis视图化工具的安装
redis多面管理器
条件:必须要有一个数值来与之关联,因为要通过这个数值来排序
zadd key score1 value1 score2 value2...: 设置添加 zrem key value1 value2... :删除指定成员 zcard key :展示元素的长度 zscore key value :获取成员的数字持久化: 就是将数据从内存保存到硬盘
1 rdb(快照方式) 默认开启的 redis.windows.conf 查save 保存策略: # after 900 sec (15 min) if at least 1 key changed 15分钟内存中有一个,往硬盘中存一次 # after 300 sec (5 min) if at least 10 keys changed 5分钟内存中有10个,往硬盘中存一次。 # after 60 sec if at least 10000 keys changed 1分钟有10000个,往硬盘中存一次 2 aof(配置文件命令方式) 默认不开启 若要开启,必须修改配置文件redis.windows.conf 搜appendonly appendonly yes 保存策略: # appendfsync always 每次都写入 # appendfsync everysec 每秒写入 appendfsync no 不写入java —jdbc —mysql
java-- -jedis- — redis
使用步骤:
1.导入jar包 2.创建jedis对象 new Jedis(ip,端口) 3.通过jedis操作redis数据库 4.释放资源当value为String类型时 当value为散列类型时 javadiamante操作redis数据库 取: jedis的pool
javadiamante操作redis数据库 取: javadiamante操作redis数据库 删: jedis的优化1:
jedis的优化2: 配置文件redis.properties 使用连接池优化: // 创建数据源的配置对象 JedisPoolConfig config = new JedisPoolConfig(); // 配置初始化连接 config.setMaxTotal(1000); // 配置空闲时期的最大连接 config.setMaxIdle(5); …
// 创建一个连接池 JedisPool pool = new JedisPool(config, "192.168.2.132",6379); // 获取jedis对象 Jedis jedis = pool.getResource();1 导包 2 导工具包 3 导配置文件 4 写代码 从redis中获取非常快 jedisUtils
package cn.itcast.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.ResourceBundle; public class JedisUtils { private static JedisPool jedisPool=null; static { // 加载配置文件 properties // 会自动去src下自己后缀名为properties的文件 ResourceBundle rb = ResourceBundle.getBundle("redis"); String url = rb.getString("url"); int port = Integer.parseInt(rb.getString("port")); int maxtotal = Integer.parseInt(rb.getString("maxtotal")); int maxidle = Integer.parseInt(rb.getString("maxidle")); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxtotal); jedisPoolConfig.setMaxIdle(maxidle); jedisPool = new JedisPool(jedisPoolConfig,url,port); } // 从jedis的连接池中获取jedis public static Jedis getJedis(){ Jedis jedis = jedisPool.getResource(); return jedis; } }redis.properties
url=localhost port=6379 maxtotal=100 maxidle=10