牛客網中級プロジェクト学習ノート-点賛点踏み機能実現
6738 ワード
Redisのユーザ讃踏機能への応用
ユーザーは1本の情報を称賛して、この情報の称賛の数量は増加して、点は踏んで数量を踏んで増加して、本プロジェクトの称賛の点は機能を踏んでredisデータベースを通じて実現して、javaはredisデータベースのツール類を操作してJedisライブラリを使うことができます.1.pom.xmlにjedisのjarパッケージを導入するには:
2.操作redisのビジネスクラスを設計する必要があり、Jedisオブジェクトの取得はjedis接続プールJedisPoolを通じて、Jedis操作redisの方法をビジネス層に書く.
3.賛踏業務層を設計し、1つの情報に対する賛和踏はredisのset集合によって実現され、1つの情報に対してset集合を作成し、set集合には賛/点踏のユーザー数を格納し、ユーザーが賛を押すとユーザーを賛集合に加入し、点踏はユーザーを踏集合に加入し、ユーザーがどの集合で情報を先端に伝えるべきかを判断することによって賛/踏状態をハイライトすべきである.
4.Controllerは、ユーザ賛/踏要求を取得した後、LikeServiceのメソッドを呼び出してユーザ賛/踏情報をredisデータベースに追加する.
ちなみにredisの応用シーン:PV//ディスカッションエリアの閲覧数はRedisに格納されている.いいね//いいね、userIdはRedisの中に置く.関心//人と人の間の関心、関心者は集合で、Redisに入れて、もし関心を取り消すならば、集合の中から削除します;ランキング//登録数、1回登録、数値プラス1;検証コード//検証コード、set timeout時間を使って、バックグラウンドで検証コードを生成して、Redisに入れて、期限切れの時間を設定して、例えば3分もユーザーの検証コードを受け取っていないで、自動的にRedisから検証コードを削除します;キャッシュ//牛客ネットアクセス、ホームページのユーザーの顔、ユーザー名のニックネームを開いて、もしユーザーが更新しないならば、ユーザー情報などはMySQLの上で1層のキャッシュをすることができて、もしユーザーが情報を更新していないならば、直接キャッシュから読むことができて、もしキャッシュがなければ、直接データベースに行って取って、大いにデータベースの圧力を下げます;非同期キュー//いいね、誰が投稿を評論して、事件が発生して、redisに入れて、後ろにスレッドが実行します;クイズキュー//ユーザはクイズを提出し、クイズキューに入れ、Redisではサーバがクイズキューを実行し、ピークに遭遇した場合、マシンを追加することができます.
高同時性の場合、例えば秒殺、多くのユーザーが操作し、商品数、閲覧量、コメント数を記録し、要求のたびにデータベースのupdateフィールドに行くと、サーバが詰まりやすくなります.この場合、redisを使用して、データをメモリに書き込み、データベースにタイミングよく更新することができます.また、ユーザーにとって1、2秒のデータ変化の遅延には大きな影響はありません.
ユーザーは1本の情報を称賛して、この情報の称賛の数量は増加して、点は踏んで数量を踏んで増加して、本プロジェクトの称賛の点は機能を踏んでredisデータベースを通じて実現して、javaはredisデータベースのツール類を操作してJedisライブラリを使うことができます.1.pom.xmlにjedisのjarパッケージを導入するには:
redis.clients
jedis
2.8.0
2.操作redisのビジネスクラスを設計する必要があり、Jedisオブジェクトの取得はjedis接続プールJedisPoolを通じて、Jedis操作redisの方法をビジネス層に書く.
@Service
public class JedisAdapter implements InitializingBean {
/*InitializingBean bean ,
afterPropertiesSet , , bean 。*/
private JedisPool pool=null;
private static final Logger logger = LoggerFactory.getLogger(JedisAdapter.class);
@Override
public void afterPropertiesSet() throws Exception {//
// TODO Auto-generated method stub
pool=new JedisPool("localhost",6379);// Jedis
}
public Jedis getJedis() {
return pool.getResource();
}
public void set(String key,String value) {
Jedis jedis=null;
try {
jedis=pool.getResource();
jedis.set(key, value);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
}finally {
if(jedis!=null) jedis.close();
}
}
public String get(String key) {
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.get(key);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return null;
}finally {
if(jedis!=null) jedis.close();
}
}
public long sadd(String set,String value) {
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.sadd(set, value);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return 0;
}finally {
if(jedis!=null) jedis.close();
}
}
public long srem(String set,String value) {
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.srem(set, value);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return 0;
}finally {
if(jedis!=null) jedis.close();
}
}
public boolean sismember(String set,String value) {
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.sismember(set, value);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return false;
}finally {
if(jedis!=null) jedis.close();
}
}
public long scard(String set) {
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.scard(set);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return 0;
}finally {
if(jedis!=null) jedis.close();
}
}
public long lpush(String key,String value) {
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.lpush(key, value);//
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return 0;
}finally {
if(jedis!=null) jedis.close();
}
}
public List brpop(int timeout,String key){//
Jedis jedis=null;
try {
jedis=pool.getResource();
return jedis.brpop(timeout,key);
}catch(Exception e) {
logger.error("redis :"+e.getMessage());
return null;
}finally {
if(jedis!=null) jedis.close();
}
}
}
3.賛踏業務層を設計し、1つの情報に対する賛和踏はredisのset集合によって実現され、1つの情報に対してset集合を作成し、set集合には賛/点踏のユーザー数を格納し、ユーザーが賛を押すとユーザーを賛集合に加入し、点踏はユーザーを踏集合に加入し、ユーザーがどの集合で情報を先端に伝えるべきかを判断することによって賛/踏状態をハイライトすべきである.
@Service
public class LikeService {
@Autowired
private JedisAdapter jedisAdapter;
public int getLikeStatus(int userId,int entityType,int entityId) {
// , 1, -1, 0
// , ,
String likeSta=RedisKeyUtil.getLikeKey(entityId, entityType);
if(jedisAdapter.sismember(likeSta, String.valueOf(userId))) return 1;
String disLikeSta=RedisKeyUtil.getDisLikeKey(entityId, entityType);
return jedisAdapter.sismember(disLikeSta, String.valueOf(userId))? -1:0;
}
public long like(int userId,int entityType,int entityId) {
// , ,
String likeSta=RedisKeyUtil.getLikeKey(entityId, entityType);
jedisAdapter.sadd(likeSta, String.valueOf(userId));
String disLikeSta=RedisKeyUtil.getDisLikeKey(entityId, entityType);
jedisAdapter.srem(disLikeSta, String .valueOf(userId));
return jedisAdapter.scard(likeSta);//
}
public long disLike(int userId,int entityType,int entityId) {
// ,
String disLikeSta=RedisKeyUtil.getDisLikeKey(entityId, entityType);
jedisAdapter.sadd(disLikeSta, String .valueOf(userId));
String likeSta=RedisKeyUtil.getLikeKey(entityId, entityType);
jedisAdapter.srem(likeSta, String.valueOf(userId));
return jedisAdapter.scard(likeSta);//
}
}
4.Controllerは、ユーザ賛/踏要求を取得した後、LikeServiceのメソッドを呼び出してユーザ賛/踏情報をredisデータベースに追加する.
@Controller
public class LikeController {
@Autowired
private HostHolder holder;
@Autowired
private LikeService likeService;
@Autowired
private NewsService newsService;
@RequestMapping(value="/like",method = {RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public String like(@Param("newsId") int newsId) {
int userId=holder.getUser().getId();
long likeCount=likeService.like(userId, EntityType.ENTITY_NEWS, newsId);
newsService.updateLikeCount(newsId,(int)likeCount);//
return ToutiaoUtil.getJSONString(0, String.valueOf(likeCount));
}
@RequestMapping(value="/dislike",method = {RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public String disLike(@Param("newsId") int newsId) {
int userId=holder.getUser().getId();
long likeCount=likeService.disLike(userId, EntityType.ENTITY_NEWS, newsId);
newsService.updateLikeCount(newsId,(int)likeCount);
return ToutiaoUtil.getJSONString(0, String.valueOf(likeCount));
}
}
ちなみにredisの応用シーン:PV//ディスカッションエリアの閲覧数はRedisに格納されている.いいね//いいね、userIdはRedisの中に置く.関心//人と人の間の関心、関心者は集合で、Redisに入れて、もし関心を取り消すならば、集合の中から削除します;ランキング//登録数、1回登録、数値プラス1;検証コード//検証コード、set timeout時間を使って、バックグラウンドで検証コードを生成して、Redisに入れて、期限切れの時間を設定して、例えば3分もユーザーの検証コードを受け取っていないで、自動的にRedisから検証コードを削除します;キャッシュ//牛客ネットアクセス、ホームページのユーザーの顔、ユーザー名のニックネームを開いて、もしユーザーが更新しないならば、ユーザー情報などはMySQLの上で1層のキャッシュをすることができて、もしユーザーが情報を更新していないならば、直接キャッシュから読むことができて、もしキャッシュがなければ、直接データベースに行って取って、大いにデータベースの圧力を下げます;非同期キュー//いいね、誰が投稿を評論して、事件が発生して、redisに入れて、後ろにスレッドが実行します;クイズキュー//ユーザはクイズを提出し、クイズキューに入れ、Redisではサーバがクイズキューを実行し、ピークに遭遇した場合、マシンを追加することができます.
高同時性の場合、例えば秒殺、多くのユーザーが操作し、商品数、閲覧量、コメント数を記録し、要求のたびにデータベースのupdateフィールドに行くと、サーバが詰まりやすくなります.この場合、redisを使用して、データをメモリに書き込み、データベースにタイミングよく更新することができます.また、ユーザーにとって1、2秒のデータ変化の遅延には大きな影響はありません.